{
  "schemaVersion": "basics-course/2.0",
  "title": "森虫虫系列课｜Codex 完整基础课",
  "brand": "森虫虫系列课",
  "status": "locked",
  "updated": "2026-10-24",
  "voice": {
    "speaker": "Serena",
    "disclosure": "AI 合成"
  },
  "style": "奶油白纸张拼贴；深海军蓝；天蓝、暖橙、鼠尾草绿；图片、点击、展开、高亮、放大与暂停问答",
  "sceneCount": 233,
  "chapters": [
    {
      "id": "C01",
      "title": "认识 Codex、安装与入口",
      "count": 10,
      "owner": "course_content",
      "start": "S001",
      "end": "S010",
      "file": "chapters/C01.json",
      "sceneIds": [
        "S001",
        "S002",
        "S003",
        "S004",
        "S005",
        "S006",
        "S007",
        "S008",
        "S009",
        "S010"
      ],
      "status": "locked",
      "narrationCharacters": 1064
    },
    {
      "id": "C02",
      "title": "界面导航与聊天管理",
      "count": 11,
      "owner": "course_content",
      "start": "S011",
      "end": "S021",
      "file": "chapters/C02.json",
      "sceneIds": [
        "S011",
        "S012",
        "S013",
        "S014",
        "S015",
        "S016",
        "S017",
        "S018",
        "S019",
        "S020",
        "S021"
      ],
      "status": "locked",
      "narrationCharacters": 1278
    },
    {
      "id": "C03",
      "title": "项目、文件与上下文",
      "count": 12,
      "owner": "course_content",
      "start": "S022",
      "end": "S033",
      "file": "chapters/C03.json",
      "sceneIds": [
        "S022",
        "S023",
        "S024",
        "S025",
        "S026",
        "S027",
        "S028",
        "S029",
        "S030",
        "S031",
        "S032",
        "S033"
      ],
      "status": "locked",
      "narrationCharacters": 1391
    },
    {
      "id": "C04",
      "title": "输入框、资料引用与提问",
      "count": 12,
      "owner": "course_content",
      "start": "S034",
      "end": "S045",
      "file": "chapters/C04.json",
      "sceneIds": [
        "S034",
        "S035",
        "S036",
        "S037",
        "S038",
        "S039",
        "S040",
        "S041",
        "S042",
        "S043",
        "S044",
        "S045"
      ],
      "status": "locked",
      "narrationCharacters": 1421
    },
    {
      "id": "C05",
      "title": "运行控制、计划与聊天分支",
      "count": 12,
      "owner": "course_content",
      "start": "S046",
      "end": "S057",
      "file": "chapters/C05.json",
      "sceneIds": [
        "S046",
        "S047",
        "S048",
        "S049",
        "S050",
        "S051",
        "S052",
        "S053",
        "S054",
        "S055",
        "S056",
        "S057"
      ],
      "status": "locked",
      "narrationCharacters": 1434
    },
    {
      "id": "C06",
      "title": "模型、推理强度与使用情况",
      "count": 10,
      "owner": "course_content",
      "start": "S058",
      "end": "S067",
      "file": "chapters/C06.json",
      "sceneIds": [
        "S058",
        "S059",
        "S060",
        "S061",
        "S062",
        "S063",
        "S064",
        "S065",
        "S066",
        "S067"
      ],
      "status": "locked",
      "narrationCharacters": 1219
    },
    {
      "id": "C07",
      "title": "权限、联网与授权",
      "count": 12,
      "owner": "course_content",
      "start": "S068",
      "end": "S079",
      "file": "chapters/C07.json",
      "sceneIds": [
        "S068",
        "S069",
        "S070",
        "S071",
        "S072",
        "S073",
        "S074",
        "S075",
        "S076",
        "S077",
        "S078",
        "S079"
      ],
      "status": "locked",
      "narrationCharacters": 1437
    },
    {
      "id": "C08",
      "title": "阅读文件、编辑与预览",
      "count": 10,
      "owner": "course_content",
      "start": "S080",
      "end": "S089",
      "file": "chapters/C08.json",
      "sceneIds": [
        "S080",
        "S081",
        "S082",
        "S083",
        "S084",
        "S085",
        "S086",
        "S087",
        "S088",
        "S089"
      ],
      "status": "locked",
      "narrationCharacters": 1162
    },
    {
      "id": "C09",
      "title": "终端从看懂到可控",
      "count": 11,
      "owner": "audio_pipeline",
      "start": "S090",
      "end": "S100",
      "file": "chapters/C09.json",
      "sceneIds": [
        "S090",
        "S091",
        "S092",
        "S093",
        "S094",
        "S095",
        "S096",
        "S097",
        "S098",
        "S099",
        "S100"
      ],
      "status": "locked",
      "narrationCharacters": 1342
    },
    {
      "id": "C10",
      "title": "Git 基础与协作动作",
      "count": 12,
      "owner": "audio_pipeline",
      "start": "S101",
      "end": "S112",
      "file": "chapters/C10.json",
      "sceneIds": [
        "S101",
        "S102",
        "S103",
        "S104",
        "S105",
        "S106",
        "S107",
        "S108",
        "S109",
        "S110",
        "S111",
        "S112"
      ],
      "status": "locked",
      "narrationCharacters": 1530
    },
    {
      "id": "C11",
      "title": "diff、代码审查与测试",
      "count": 11,
      "owner": "audio_pipeline",
      "start": "S113",
      "end": "S123",
      "file": "chapters/C11.json",
      "sceneIds": [
        "S113",
        "S114",
        "S115",
        "S116",
        "S117",
        "S118",
        "S119",
        "S120",
        "S121",
        "S122",
        "S123"
      ],
      "status": "locked",
      "narrationCharacters": 1403
    },
    {
      "id": "C12",
      "title": "Worktree、并行与交接",
      "count": 10,
      "owner": "audio_pipeline",
      "start": "S124",
      "end": "S133",
      "file": "chapters/C12.json",
      "sceneIds": [
        "S124",
        "S125",
        "S126",
        "S127",
        "S128",
        "S129",
        "S130",
        "S131",
        "S132",
        "S133"
      ],
      "status": "locked",
      "narrationCharacters": 1315
    },
    {
      "id": "C13",
      "title": "本地、云端、远程与环境",
      "count": 10,
      "owner": "course_content",
      "start": "S134",
      "end": "S143",
      "file": "chapters/C13.json",
      "sceneIds": [
        "S134",
        "S135",
        "S136",
        "S137",
        "S138",
        "S139",
        "S140",
        "S141",
        "S142",
        "S143"
      ],
      "status": "locked",
      "narrationCharacters": 1186
    },
    {
      "id": "C14",
      "title": "Skill 的发现与使用",
      "count": 11,
      "owner": "course_content",
      "start": "S144",
      "end": "S154",
      "file": "chapters/C14.json",
      "sceneIds": [
        "S144",
        "S145",
        "S146",
        "S147",
        "S148",
        "S149",
        "S150",
        "S151",
        "S152",
        "S153",
        "S154"
      ],
      "status": "locked",
      "narrationCharacters": 1322
    },
    {
      "id": "C15",
      "title": "插件、MCP 与服务连接",
      "count": 13,
      "owner": "course_content",
      "start": "S155",
      "end": "S167",
      "file": "chapters/C15.json",
      "sceneIds": [
        "S155",
        "S156",
        "S157",
        "S158",
        "S159",
        "S160",
        "S161",
        "S162",
        "S163",
        "S164",
        "S165",
        "S166",
        "S167"
      ],
      "status": "locked",
      "narrationCharacters": 1576
    },
    {
      "id": "C16",
      "title": "Hooks：事件触发的动作",
      "count": 8,
      "owner": "root",
      "start": "S168",
      "end": "S175",
      "file": "chapters/C16.json",
      "sceneIds": [
        "S168",
        "S169",
        "S170",
        "S171",
        "S172",
        "S173",
        "S174",
        "S175"
      ],
      "status": "locked",
      "narrationCharacters": 1079
    },
    {
      "id": "C17",
      "title": "计划任务与自动化",
      "count": 10,
      "owner": "course_content",
      "start": "S176",
      "end": "S185",
      "file": "chapters/C17.json",
      "sceneIds": [
        "S176",
        "S177",
        "S178",
        "S179",
        "S180",
        "S181",
        "S182",
        "S183",
        "S184",
        "S185"
      ],
      "status": "locked",
      "narrationCharacters": 1228
    },
    {
      "id": "C18",
      "title": "Dots：持续工作的代理",
      "count": 8,
      "owner": "root",
      "start": "S186",
      "end": "S193",
      "file": "chapters/C18.json",
      "sceneIds": [
        "S186",
        "S187",
        "S188",
        "S189",
        "S190",
        "S191",
        "S192",
        "S193"
      ],
      "status": "locked",
      "narrationCharacters": 1135
    },
    {
      "id": "C19",
      "title": "浏览器与电脑操控",
      "count": 8,
      "owner": "root",
      "start": "S194",
      "end": "S201",
      "file": "chapters/C19.json",
      "sceneIds": [
        "S194",
        "S195",
        "S196",
        "S197",
        "S198",
        "S199",
        "S200",
        "S201"
      ],
      "status": "locked",
      "narrationCharacters": 1177
    },
    {
      "id": "C20",
      "title": "设置、偏好与配置边界",
      "count": 9,
      "owner": "root",
      "start": "S202",
      "end": "S210",
      "file": "chapters/C20.json",
      "sceneIds": [
        "S202",
        "S203",
        "S204",
        "S205",
        "S206",
        "S207",
        "S208",
        "S209",
        "S210"
      ],
      "status": "locked",
      "narrationCharacters": 1343
    },
    {
      "id": "C21",
      "title": "排错与恢复控制",
      "count": 10,
      "owner": "course_content",
      "start": "S211",
      "end": "S220",
      "file": "chapters/C21.json",
      "sceneIds": [
        "S211",
        "S212",
        "S213",
        "S214",
        "S215",
        "S216",
        "S217",
        "S218",
        "S219",
        "S220"
      ],
      "status": "locked",
      "narrationCharacters": 1169
    },
    {
      "id": "C22",
      "title": "其他常用功能与复习导览",
      "count": 13,
      "owner": "course_content",
      "start": "S221",
      "end": "S233",
      "file": "chapters/C22.json",
      "sceneIds": [
        "S221",
        "S222",
        "S223",
        "S224",
        "S225",
        "S226",
        "S227",
        "S228",
        "S229",
        "S230",
        "S231",
        "S232",
        "S233"
      ],
      "status": "locked",
      "narrationCharacters": 1565
    }
  ],
  "scenes": [
    {
      "id": "S001",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "Codex 完整基础课",
      "kind": "title",
      "narration": "你好，这里是森虫虫的系列课。这次我们从最基础的地方认识 Codex。你不需要先会编程，也不用跟着做一个项目。我们要弄清楚界面里的功能是什么，什么时候该点，点了以后怎样判断结果。遇到终端、工作树这些陌生词，也会先用普通话解释，再看它们各自的作用。",
      "lines": [
        "先懂功能",
        "再看操作",
        "最后检查"
      ],
      "sourceIds": [
        "T01"
      ],
      "evidenceStatus": "teaching_design",
      "visual": {
        "template": "collage-title",
        "expandItems": [
          "先懂功能",
          "再看操作",
          "最后检查"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S002",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "代理不只是在回答",
      "kind": "concept",
      "narration": "先认识一个重要区别：有时它只是在解释问题，有时它会调用工具，真的去读取文件、执行命令或者修改内容。这种能够围绕目标采取行动的助手，通常叫代理。所以看见一段回复，我们还要继续看：它只是提出建议，还是已经执行了动作？这会影响下一步怎么检查。",
      "lines": [
        "解释一个问题",
        "执行一个动作",
        "分清是否已经发生"
      ],
      "sourceIds": [
        "D01",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "concept",
        "expandItems": [
          "解释一个问题",
          "执行一个动作",
          "分清是否已经发生"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S003",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "Codex 主要擅长什么",
      "kind": "concept",
      "narration": "Codex 的主要定位是代码和开发相关工作，比如解释一段程序、寻找问题、修改文件、运行检查。即使你不会写代码，也可以先让它解释眼前的材料，再判断是否需要继续。不过，如果只是日常问答，或者一般文档工作，应用里的其他入口也可能更合适，不必凡事都从 Codex 开始。",
      "lines": [
        "解释代码",
        "修改相关文件",
        "运行与检查"
      ],
      "sourceIds": [
        "D01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "concept",
        "expandItems": [
          "解释代码",
          "修改相关文件",
          "运行与检查"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S004",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "能力要有材料和工具",
      "kind": "concept",
      "narration": "它能做什么，除了模型能力，还取决于眼前有没有材料、有没有相应工具，以及是否获得允许。你说查看电脑里的文件，不代表它已经能看到所有文件；你说联系一个外部服务，也不代表账号已经连接。能力、材料、连接和权限要分别成立，任务才有可能顺利进行。",
      "lines": [
        "材料是否提供",
        "工具是否可用",
        "权限是否允许"
      ],
      "sourceIds": [
        "D01",
        "D11",
        "D16"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "concept",
        "expandItems": [
          "材料是否提供",
          "工具是否可用",
          "权限是否允许"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S005",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "完成还要看结果",
      "kind": "concept",
      "narration": "当它说已经完成，我们可以把这当成一份工作汇报，接着检查实际结果。例如它说解释了某份文件，就看是否引用了正确材料；它说做过检查，就看检查了什么、结果是什么。模型可能理解错，也可能遗漏条件。把结果核对清楚，是使用过程的一部分，不是对话结束以后可有可无的步骤。",
      "lines": [
        "看实际结果",
        "看检查范围",
        "保留未确认项"
      ],
      "sourceIds": [
        "T01"
      ],
      "evidenceStatus": "teaching_design",
      "visual": {
        "template": "concept",
        "expandItems": [
          "看实际结果",
          "看检查范围",
          "保留未确认项"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S006",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "三个入口怎么区分",
      "kind": "concept",
      "narration": "当前官方资料把 Chat、Work 和 Codex 分成不同的工作入口。你可以先理解成：Chat 偏向对话问答，Work 偏向一般工作任务，Codex 偏向代码和开发工具。这是用途上的分工，不是好坏排名。它们可能有重叠能力，但文件访问、设置和可用工具不能直接当成完全一样。",
      "lines": [
        "Chat：对话问答",
        "Work：一般工作",
        "Codex：开发相关"
      ],
      "sourceIds": [
        "D01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "Chat：对话问答",
          "Work：一般工作",
          "Codex：开发相关"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S007",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "应用名字不等于工作模式",
      "kind": "concept",
      "narration": "你可能在桌面看到 ChatGPT 这个应用名字，而教程讨论的是里面的 Codex 入口。本次核对的安装包也是这种情况。打开了同一个应用，并不能证明当前聊天正在使用同一种工作模式。先确认自己进入哪里，再对照教程。画面中的界面会标成教学重绘，不冒充你电脑上的实时截图。",
      "lines": [
        "应用名称",
        "当前入口",
        "教学重绘"
      ],
      "sourceIds": [
        "D01",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "应用名称",
          "当前入口",
          "教学重绘"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S008",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "从官方入口安装",
      "kind": "workflow",
      "narration": "如果你还没有安装，可以从配套资料里的官方快速开始页面进入，选择适合 Mac 的下载入口，按安装向导完成。这里不让你记住一个可能过期的安装包文件名。下载、系统要求和可用版本都以当时的官方页面为准。已经安装的朋友，只需要先确认应用来源和版本，就可以继续学习。",
      "lines": [
        "打开官方快速开始",
        "选择 Mac 入口",
        "按向导安装"
      ],
      "sourceIds": [
        "D01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "打开官方快速开始",
          "选择 Mac 入口",
          "按向导安装"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S009",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "登录后仍要确认条件",
      "kind": "concept",
      "narration": "安装完成后，按应用提示登录自己的账号。登录解决的是你是谁，并不自动保证每个功能都开放。个人账号、组织账号、产品版本和管理员设置，都可能影响你看到的选项。如果教程里有一个按钮，你的界面暂时没有，先记住这个差异，后面会讲如何检查，不要急着反复安装。",
      "lines": [
        "登录自己的账号",
        "确认可用入口",
        "功能可能有条件"
      ],
      "sourceIds": [
        "D01",
        "D20"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "concept",
        "expandItems": [
          "登录自己的账号",
          "确认可用入口",
          "功能可能有条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S010",
      "chapterId": "C01",
      "chapter": "01 认识 Codex、安装与入口",
      "title": "先建立正确预期",
      "kind": "recap",
      "narration": "现在做一个小判断：应用已经装在电脑上，是不是说明大模型就在电脑里离线运行？答案是否定的。安装位置、文件动作发生的位置、模型服务的位置，是不同问题。另一个判断是，看到同样的应用名字，功能是否完全一样？也不一定。记住这两点，后面遇到各种选项就不容易混淆。",
      "lines": [
        "安装在电脑上",
        "不等于模型离线",
        "同名应用也可能有差异"
      ],
      "sourceIds": [
        "D01",
        "D08",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "quiz",
        "expandItems": [
          "安装在电脑上",
          "不等于模型离线",
          "同名应用也可能有差异"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      },
      "quiz": {
        "question": "应用安装在本机，是否说明大模型可以离线运行？",
        "options": [
          "是，安装后就完全离线",
          "不是，安装与模型运行位置要分开"
        ],
        "answerIndex": 1,
        "explanation": "本地应用和本地文件动作，不等于模型服务也在本机离线运行。",
        "pauseAfterText": "现在做一个小判断：应用已经装在电脑上，是不是说明大模型就在电脑里离线运行？",
        "pauseSeconds": 5
      }
    },
    {
      "id": "S011",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "先认四个区域",
      "kind": "ui",
      "narration": "先把界面分成四个功能区域：导航帮你找到聊天和项目，聊天区显示沟通过程，输入区用来提出请求，文件或结果面板用来检查材料。本章按桌面 Codex 的入口演示，账号和版本可能改变排列或可用项，画面是帮助辨认功能的示意。接下来先练会新建、查找和整理聊天，再认识项目与文件。",
      "lines": [
        "导航",
        "聊天与输入",
        "文件与结果"
      ],
      "sourceIds": [
        "D05",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "ui-map",
        "expandItems": [
          "导航",
          "聊天与输入",
          "文件与结果"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S012",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "新聊天是新目标",
      "kind": "ui",
      "narration": "开始一个新目标，先点侧栏的新聊天；如果需要独立于项目，使用最近记录旁的新聊天入口，并确认输入区没有选中不想使用的项目。如果继续围绕已有材料工作，就先打开那个项目，再新建聊天。新聊天会开始一段新的沟通记录，但不会因为这个按钮，就自动在电脑上建立一个同名文件夹。",
      "lines": [
        "侧栏：新聊天",
        "先确认所属项目",
        "新记录不等于新文件夹"
      ],
      "sourceIds": [
        "D02",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "点击新聊天",
          "核对所选项目或独立聊天",
          "输入这次的新目标"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "sidebarElectron.newThread",
        "steps": [
          "点击新聊天",
          "核对所选项目或独立聊天",
          "输入这次的新目标"
        ]
      },
      "uiRefs": [
        "sidebarElectron.newThread"
      ],
      "steps": [
        "点击新聊天",
        "核对所选项目或独立聊天",
        "输入这次的新目标"
      ]
    },
    {
      "id": "S013",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "什么时候使用项目",
      "kind": "concept",
      "narration": "想按主题组织持续工作，先点侧栏的项目，打开已有项目，或者选择添加新项目。进入以后再从项目里开始聊天，这样以后可以按同一主题找回。如果要操作电脑文件，还需要关联本地目录，下一章会展开。临时解释一个术语，独立聊天就够；经常使用同一组资料，再放进项目，不必先建一堆空分类。",
      "lines": [
        "项目：组织相关工作",
        "打开已有或添加新项目",
        "从项目内开始聊天"
      ],
      "sourceIds": [
        "D02",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "点击项目",
          "打开已有项目或添加新项目",
          "从项目中开始聊天"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "sidebarElectron.projectsNavLink",
        "steps": [
          "点击项目",
          "打开已有项目或添加新项目",
          "从项目中开始聊天"
        ]
      },
      "uiRefs": [
        "sidebarElectron.projectsNavLink",
        "sidebarElectron.addGenericWorkspaceRoot"
      ],
      "steps": [
        "点击项目",
        "打开已有项目或添加新项目",
        "从项目中开始聊天"
      ]
    },
    {
      "id": "S014",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "从历史继续工作",
      "kind": "workflow",
      "narration": "打开历史聊天以后，先看最后一条有效回复，确认已经完成了什么、还在等什么，以及结果放在哪里。再发一句具体的继续要求。这样比只说继续更可靠，因为旧聊天可能停在等待批准、等待材料，或者已经结束。找到旧记录只是第一步，理解它的最后状态，才知道下一步该怎么接。",
      "lines": [
        "看最后状态",
        "找到已有结果",
        "再说明下一步"
      ],
      "sourceIds": [
        "D02",
        "D20"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "看最后状态",
          "找到已有结果",
          "再说明下一步"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S015",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "找聊天用搜索",
      "kind": "ui",
      "narration": "忘记聊天放在哪里，先点击侧栏的搜索，在搜索框输入记得的主题词、结果名称或聊天标题，再打开匹配的记录。进入后读最后一条有效回复，确认这确实是要继续的那段。结果太多就换更具体的词；没有结果，再检查项目和归档状态。这里查的是聊天记录，不是在电脑里搜索全部文件。",
      "lines": [
        "搜索主题词或标题",
        "打开记录核对末条回复",
        "无结果再查项目和归档"
      ],
      "sourceIds": [
        "D02",
        "D20",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "侧栏点击搜索",
          "输入主题词或标题",
          "打开结果并核对内容"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "sidebarElectron.search",
        "steps": [
          "侧栏点击搜索",
          "输入主题词或标题",
          "打开结果并核对内容"
        ]
      },
      "uiRefs": [
        "sidebarElectron.search"
      ],
      "steps": [
        "侧栏点击搜索",
        "输入主题词或标题",
        "打开结果并核对内容"
      ]
    },
    {
      "id": "S016",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "三种查找别混用",
      "kind": "concept",
      "narration": "这里有三个相似但不同的需求：找某段聊天，在当前聊天里找一句话，以及找项目里的某个文件。它们对应的查找范围不同，所以按钮和快捷键也可能不同。按下某个组合键没有出现想要的结果，先问自己正在找什么。快捷键可以在设置里查看，不要把一个搜索按键当成通用答案。",
      "lines": [
        "找聊天",
        "找当前聊天里的文字",
        "找项目文件"
      ],
      "sourceIds": [
        "D05",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "找聊天",
          "找当前聊天里的文字",
          "找项目文件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S017",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "给聊天起有用的名字",
      "kind": "ui",
      "narration": "给聊天改名，先在侧栏找到目标聊天，打开它的操作菜单，选择重命名聊天，输入新标题并确认。也可以在当前聊天输入斜杠 rename，选中重命名命令。改完回到侧栏，确认名称已经更新。标题可以写成解释登录报错，便于下次辨认；改名不会改变聊天材料、文件路径或访问权限。",
      "lines": [
        "聊天菜单 → 重命名聊天",
        "也可输入 /rename",
        "确认侧栏标题已更新"
      ],
      "sourceIds": [
        "D02",
        "U01",
        "D06"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "找到目标聊天",
          "操作菜单：重命名聊天",
          "输入标题并确认",
          "核对侧栏新名称"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "threadHeader.moreActions",
        "steps": [
          "找到目标聊天",
          "操作菜单：重命名聊天",
          "输入标题并确认",
          "核对侧栏新名称"
        ]
      },
      "uiRefs": [
        "sidebarElectron.renameThread",
        "threadHeader.moreActions"
      ],
      "steps": [
        "找到目标聊天",
        "操作菜单：重命名聊天",
        "输入标题并确认",
        "核对侧栏新名称"
      ]
    },
    {
      "id": "S018",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "置顶改变的是位置",
      "kind": "concept",
      "narration": "经常返回的聊天，打开它的操作菜单，选择置顶聊天，再看侧栏的置顶区域是否出现这条记录。以后不需要了，在同一类菜单里选择取消置顶聊天；当前聊天也可以用斜杠 pin 切换。置顶只改变查找位置，不会增加模型记忆或文件权限。把它留给真正经常使用的少量记录，侧栏才容易看清。",
      "lines": [
        "操作菜单 → 置顶聊天",
        "到置顶区域确认",
        "取消置顶恢复普通位置"
      ],
      "sourceIds": [
        "D02",
        "U01",
        "D06"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "打开目标聊天操作菜单",
          "选择置顶聊天",
          "检查置顶区域",
          "需要时取消置顶聊天"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "threadHeader.moreActions",
        "steps": [
          "打开目标聊天操作菜单",
          "选择置顶聊天",
          "检查置顶区域",
          "需要时取消置顶聊天"
        ]
      },
      "uiRefs": [
        "sidebarElectron.pinThread",
        "sidebarElectron.unpinThread",
        "threadHeader.moreActions"
      ],
      "steps": [
        "打开目标聊天操作菜单",
        "选择置顶聊天",
        "检查置顶区域",
        "需要时取消置顶聊天"
      ]
    },
    {
      "id": "S019",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "归档前看清影响",
      "kind": "concept",
      "narration": "暂时不用的聊天，可以打开操作菜单，选择归档聊天，读清确认内容再完成。归档运行中的聊天会停止工作；带计划任务的聊天，还可能移除相关计划，所以先确认自己确实要结束这些安排。要找回来，打开设置，进入已归档的聊天，找到记录后恢复。最后检查它是否回到列表，不能把归档当作删除磁盘文件。",
      "lines": [
        "操作菜单 → 归档聊天",
        "先核对运行与计划影响",
        "设置 → 已归档的聊天"
      ],
      "sourceIds": [
        "D20",
        "U01",
        "D02"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "选择归档聊天",
          "阅读影响并确认",
          "设置中打开已归档的聊天",
          "找到记录并恢复"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "threadHeader.moreActions",
        "steps": [
          "选择归档聊天",
          "阅读影响并确认",
          "设置中打开已归档的聊天",
          "找到记录并恢复"
        ]
      },
      "uiRefs": [
        "sidebarElectron.archiveThread",
        "settings.nav.archived-chats",
        "threadHeader.moreActions"
      ],
      "steps": [
        "选择归档聊天",
        "阅读影响并确认",
        "设置中打开已归档的聊天",
        "找到记录并恢复"
      ]
    },
    {
      "id": "S020",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "移除项目不是删目录",
      "kind": "concept",
      "narration": "清理项目列表时，先打开目标项目的菜单，选择移除项目，再检查确认框说明。这个动作是从应用列表移除关联，不删除本地文件或现有聊天。若只是想找磁盘目录，可以用在 Finder 中显示，先确认文件还在哪里。真正删除电脑上的文件夹，是另一种动作。列表里不见了，不能作为文件已经删除的证据。",
      "lines": [
        "项目菜单 → 移除项目",
        "不删除本地文件和现有聊天",
        "在 Finder 中显示可定位"
      ],
      "sourceIds": [
        "U01"
      ],
      "evidenceStatus": "installed_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "打开项目菜单",
          "选择移除项目并读说明",
          "确认是否只移除关联"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "sidebarElectron.removeProject.menuItem.local",
        "steps": [
          "打开项目菜单",
          "选择移除项目并读说明",
          "确认是否只移除关联"
        ]
      },
      "uiRefs": [
        "sidebarElectron.removeProject.menuItem.local",
        "sidebarElectron.openWorkspaceRootInFinder"
      ],
      "steps": [
        "打开项目菜单",
        "选择移除项目并读说明",
        "确认是否只移除关联"
      ]
    },
    {
      "id": "S021",
      "chapterId": "C02",
      "chapter": "02 界面导航与聊天管理",
      "title": "把界面调到看得清",
      "kind": "ui",
      "narration": "看不到文件或底部面板时，先打开应用的命令菜单，搜索显示或隐藏，再选导航面板、变更面板或底部面板等对应动作。需要单独查看聊天，可以选择在新窗口中打开。找不到命令菜单的快捷键，就到设置的键盘快捷键里搜索打开命令菜单。面板收起只是显示变化，任务是否停止仍要看聊天运行状态。",
      "lines": [
        "命令菜单中搜索面板",
        "选择显示或隐藏",
        "新窗口便于单独查看"
      ],
      "sourceIds": [
        "D05",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "ui-map",
        "expandItems": [
          "打开命令菜单",
          "搜索所需面板名称",
          "选择显示或隐藏命令",
          "检查面板出现或收起"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "codex.commandMenuTitle.openCommandMenu",
        "steps": [
          "打开命令菜单",
          "搜索所需面板名称",
          "选择显示或隐藏命令",
          "检查面板出现或收起"
        ]
      },
      "uiRefs": [
        "codex.commandMenuTitle.toggleFileTreePanel",
        "codex.command.toggleBottomPanel",
        "codex.commandMenuTitle.openCommandMenu",
        "codex.command.openThreadInNewWindow"
      ],
      "steps": [
        "打开命令菜单",
        "搜索所需面板名称",
        "选择显示或隐藏命令",
        "检查面板出现或收起"
      ]
    },
    {
      "id": "S022",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "先分开三个东西",
      "kind": "concept",
      "narration": "项目、聊天、文件，是最容易混在一起的三个词。项目用来组织一组工作，聊天保存这段沟通过程，文件才是电脑或服务里的实际材料。你可以在一个项目里开多个聊天，也可以在聊天里讨论同一份文件。理解这个关系以后，就不会把删除一段文字、归档聊天和修改文件，当成同一种操作。",
      "lines": [
        "项目：组织工作",
        "聊天：沟通记录",
        "文件：真实材料"
      ],
      "sourceIds": [
        "D02",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "项目：组织工作",
          "聊天：沟通记录",
          "文件：真实材料"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S023",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "项目也有不同类型",
      "kind": "concept",
      "narration": "这里还要分清普通 ChatGPT 项目和关联电脑目录的本地项目。前者可以组织聊天、资料和说明，但不能因此推断它自动获得本机文件夹访问能力。后者明确关联了电脑上的工作目录，才涉及那个目录里的文件操作。看到项目两个字，先确认是哪一种，再判断材料来自哪里、动作会发生在哪里。",
      "lines": [
        "普通项目",
        "本地目录项目",
        "先确认材料来源"
      ],
      "sourceIds": [
        "D02"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "普通项目",
          "本地目录项目",
          "先确认材料来源"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S024",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "选择相关的工作文件夹",
      "kind": "ui",
      "narration": "需要处理电脑材料时，先使用打开文件夹，选中这次要工作的目录并确认；已经保存的本地项目，也可以从输入区的选择项目里直接选。选好后检查显示的项目名和目录，再发请求。如果要更改项目关联，官方路径是项目菜单里的编辑项目，再添加文件夹；多个目录时还要确认主目录。范围围绕当前工作，不要因为省一步就选整台电脑。",
      "lines": [
        "打开文件夹或选择项目",
        "核对项目名与目录",
        "多目录需确认主目录"
      ],
      "sourceIds": [
        "D02",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "打开文件夹并选择目录",
          "或在选择项目里选已有项目",
          "核对当前工作目录"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "codex.command.openFolder",
        "steps": [
          "打开文件夹并选择目录",
          "或在选择项目里选已有项目",
          "核对当前工作目录"
        ]
      },
      "uiRefs": [
        "codex.command.openFolder",
        "composer.localCwdDropdown.chooseProject"
      ],
      "steps": [
        "打开文件夹并选择目录",
        "或在选择项目里选已有项目",
        "核对当前工作目录"
      ]
    },
    {
      "id": "S025",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "确认路径而不只看名字",
      "kind": "concept",
      "narration": "电脑里可能有好几份名字一样的文件，所以只看文件名还不够。路径是在说明它位于哪个目录，你可以理解成文件的地址。需要时从结果链接打开，或者在 Finder 中定位，确认它是自己想处理的那份。尤其是旧版和新版并存时，先确认位置，能避免把正确的操作用到错误材料上。",
      "lines": [
        "文件名可能重复",
        "路径说明位置",
        "先确认再操作"
      ],
      "sourceIds": [
        "D02",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "文件名可能重复",
          "路径说明位置",
          "先确认再操作"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S026",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "同项目也有不同聊天",
      "kind": "concept",
      "narration": "同一个项目里的多个聊天，可以分别处理不同问题，比如一段负责理解说明，另一段讨论一个具体错误。它们可能共用项目材料，却各有自己的沟通记录。不要默认新聊天已经看过另一个聊天里的每句话。如果某项决定很重要，重新说明一句，或指向相应材料，会比依赖想象中的共享记忆更稳妥。",
      "lines": [
        "材料可以有关联",
        "聊天记录各自独立",
        "关键决定要说清楚"
      ],
      "sourceIds": [
        "D02"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "材料可以有关联",
          "聊天记录各自独立",
          "关键决定要说清楚"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S027",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "可访问不等于已读取",
      "kind": "concept",
      "narration": "一个文件处于可访问范围，只说明它可能被读取，不表示模型已经看过里面每一个字。就像书在桌上，不等于你已经读完。这是使用时很有帮助的区分。回答涉及某份材料时，可以要求说明依据的文件和部分；如果它没有读取必要内容，就先补这一步，而不是直接相信结论已经覆盖全部资料。",
      "lines": [
        "在范围内",
        "已经实际读取",
        "两种状态分开"
      ],
      "sourceIds": [
        "D02",
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "在范围内",
          "已经实际读取",
          "两种状态分开"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S028",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "上下文是什么",
      "kind": "concept",
      "narration": "上下文就是这一次理解任务时可以依据的背景。它可能包括当前对话、你明确提供的附件、可访问的项目材料，以及适用的工作说明。我们不用背术语，只要问：它现在凭什么理解我这句话？如果关键背景只存在于你脑子里，或者另一段未提供的对话里，就需要补充出来。",
      "lines": [
        "当前对话",
        "提供的材料",
        "适用的说明"
      ],
      "sourceIds": [
        "D02",
        "D03"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "当前对话",
          "提供的材料",
          "适用的说明"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S029",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "把版本和重点说出来",
      "kind": "prompt",
      "narration": "材料给得多，不等于指向清楚。比如同时有两份说明，可以直接说以新版为准，只解释第二部分，不必概括整份文档。这样既减少误读，也方便你核对结果。对图片也一样，指出所问区域，比只说看看这个更明确。提供材料时顺便说明用途，是一个很小但很有用的习惯。",
      "lines": [
        "哪一份材料",
        "看哪一部分",
        "希望得到什么"
      ],
      "sourceIds": [
        "D03"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "哪一份材料",
          "看哪一部分",
          "希望得到什么"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S030",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "长聊天也有容量",
      "kind": "concept",
      "narration": "随着对话变长，应用可能显示上下文用量，提醒你这段聊天正在使用多少可处理的背景。不要把它理解为电脑硬盘容量，也不要认为聊得越久就一定越了解全部细节。要求很多、方向来回变化时，重要约束容易混在一起。适时整理当前目标、已经确认的事实和剩余问题，有助于继续工作。",
      "lines": [
        "上下文不是硬盘",
        "长对话可能混杂",
        "整理当前目标"
      ],
      "sourceIds": [
        "D06",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "上下文不是硬盘",
          "长对话可能混杂",
          "整理当前目标"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.contextUsageIndicator.ariaLabel"
      },
      "uiRefs": [
        "composer.contextUsageIndicator.ariaLabel"
      ]
    },
    {
      "id": "S031",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "压缩之前保留重点",
      "kind": "concept",
      "narration": "长聊天需要整理时，先把当前目标、关键限制、结果位置和未解决的问题列出来，然后在输入框键入斜杠 compact，从候选里选择压缩。完成后，再检查这些重点是否仍然明确。压缩是在整理对话上下文，不是备份磁盘文件，也不能保证保留每个细节。重要结果应该有自己的文件或明确记录，不只依赖聊天里曾经提过。",
      "lines": [
        "先保留目标与关键限制",
        "输入 /compact → 压缩",
        "之后核对重点是否清楚"
      ],
      "sourceIds": [
        "D06",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "整理当前目标与关键决定",
          "输入 /compact 并选择压缩",
          "核对压缩后的重点"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.compactSlashCommand.title",
        "steps": [
          "整理当前目标与关键决定",
          "输入 /compact 并选择压缩",
          "核对压缩后的重点"
        ]
      },
      "uiRefs": [
        "composer.compactSlashCommand.title"
      ],
      "steps": [
        "整理当前目标与关键决定",
        "输入 /compact 并选择压缩",
        "核对压缩后的重点"
      ]
    },
    {
      "id": "S032",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "同步记录不等于同步电脑",
      "kind": "concept",
      "narration": "换设备后能够看到一段聊天，不代表那台设备能访问原电脑上的所有文件。本地文件、连接主机、云端材料和聊天记录，可能分别依赖不同条件。如果接着聊时找不到材料，先确认文件在哪台电脑、是否在线、当前执行位置是什么。不要把看见记录，直接理解成整个工作环境也已经搬过去了。",
      "lines": [
        "聊天记录可见",
        "本地文件是否可用",
        "执行环境是否相同"
      ],
      "sourceIds": [
        "D02",
        "D20"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "聊天记录可见",
          "本地文件是否可用",
          "执行环境是否相同"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S033",
      "chapterId": "C03",
      "chapter": "03 项目、文件与上下文",
      "title": "检查它究竟知道什么",
      "kind": "recap",
      "narration": "现在判断：两个聊天在同一个项目里，就不用再交代关键背景。这个说法对吗？不完全对。更好的做法是，给出这次目标，点明关键材料和已作决定，再让它开始。你不需要把所有历史重新复制一遍，只要补上影响当前判断的内容。这也是上下文管理最实用的一步。",
      "lines": [
        "目标要明确",
        "关键材料要指明",
        "重要决定要保留"
      ],
      "sourceIds": [
        "D02",
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "quiz",
        "expandItems": [
          "目标要明确",
          "关键材料要指明",
          "重要决定要保留"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      },
      "quiz": {
        "question": "同项目的新聊天，可以默认知道其他聊天全部细节吗？",
        "options": [
          "可以，不必补充任何背景",
          "不可以，重要背景仍应明确提供"
        ],
        "answerIndex": 1,
        "explanation": "项目可以组织共同材料，但不同聊天有自己的记录。",
        "pauseAfterText": "现在判断：两个聊天在同一个项目里，就不用再交代关键背景。这个说法对吗？",
        "pauseSeconds": 5
      }
    },
    {
      "id": "S034",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "请求不必写得很像模板",
      "kind": "prompt",
      "narration": "使用输入框时，不需要先学会一套神秘句式。一个清楚的请求，通常能让对方知道四件事：你想得到什么，依据哪些材料，有什么限制，以及怎样判断完成。这四项不是必须每次填满的表格。简单问题一句话就够；事情复杂时，再把缺少的条件补上，重点是让目标可以理解和检查。",
      "lines": [
        "目标",
        "材料与限制",
        "完成标准"
      ],
      "sourceIds": [
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "目标",
          "材料与限制",
          "完成标准"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S035",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "先说想拿到什么",
      "kind": "prompt",
      "narration": "同样是看一份材料，你可能想要概括、解释、找问题，也可能希望修改原文。这些结果不一样，所以先把需要的输出说清楚。例如，请用三句话解释这段说明，面向完全不懂这个词的人。这样一来，范围、对象和输出形式都比较明确。不要只说帮我看看，然后期待它猜中你心里那种结果。",
      "lines": [
        "想要哪种结果",
        "给谁看",
        "用什么形式"
      ],
      "sourceIds": [
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "concept",
        "expandItems": [
          "想要哪种结果",
          "给谁看",
          "用什么形式"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S036",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "让材料指向具体对象",
      "kind": "prompt",
      "narration": "第二步是说明依据什么。材料可能是一段粘贴文字、一个附件，也可能是项目里的文件引用。你可以说以这份说明为准，解释标出的部分。重要的是让它知道哪些材料与问题有关。如果存在多个版本，直接指定要用哪一份。这样回答错了，你也能检查是理解出了问题，还是最开始选错了材料。",
      "lines": [
        "指明材料",
        "选择版本",
        "指出重点"
      ],
      "sourceIds": [
        "D03"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "指明材料",
          "选择版本",
          "指出重点"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S037",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "边界用自然语言说明",
      "kind": "prompt",
      "narration": "限制负责告诉它哪些事情暂时不要做。例如，只解释原因，先不要修改文件；或者只处理选中的这一段，其他内容保持原样。这类说法能减少方向上的误会。但要记得，它属于任务要求，不等于系统权限已经变成只读。涉及真实文件和外部操作时，还要结合后面讲的权限边界一起判断。",
      "lines": [
        "只做哪些事情",
        "暂时不要做什么",
        "要求与权限分开"
      ],
      "sourceIds": [
        "D03",
        "D11"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "concept",
        "expandItems": [
          "只做哪些事情",
          "暂时不要做什么",
          "要求与权限分开"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S038",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "完成标准帮你检查",
      "kind": "prompt",
      "narration": "完成标准不是专业人员才需要的东西，它只是回答一个问题：怎么知道这件事做到了？比如解释术语时，希望有通俗定义和一个例子；核对内容时，希望列出依据与不确定项。要求越具体，结果越容易检查。也不用追求一次写得完美，先提出合理标准，看到回答后再补充，这是正常的沟通过程。",
      "lines": [
        "怎样判断做到",
        "需要哪些依据",
        "保留不确定项"
      ],
      "sourceIds": [
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "concept",
        "expandItems": [
          "怎样判断做到",
          "需要哪些依据",
          "保留不确定项"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S039",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "添加文件和文件夹",
      "kind": "ui",
      "narration": "添加资料，先点击输入框旁的添加文件等内容按钮，在添加菜单里选文件和文件夹，再通过选择文件指定对象。选好后，检查输入框里的附件卡：文件名对不对，有没有误选另一版，然后写明希望怎样使用它。这里的步骤适用于当前界面提供这些选项时。附加一份文件不等于开放整台电脑，也不等于允许随意修改其他材料。",
      "lines": [
        "添加文件等内容",
        "文件和文件夹 → 选择文件",
        "核对附件卡再发送"
      ],
      "sourceIds": [
        "D03",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "点击添加文件等内容",
          "选择文件和文件夹",
          "选择所需文件",
          "检查附件卡与任务范围"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.contextButton.ariaLabel",
        "steps": [
          "点击添加文件等内容",
          "选择文件和文件夹",
          "选择所需文件",
          "检查附件卡与任务范围"
        ]
      },
      "uiRefs": [
        "composer.contextButton.ariaLabel",
        "composer.contextAction.filesAndFolders",
        "composer.contextAcquisition.filePicker.selectFiles"
      ],
      "steps": [
        "点击添加文件等内容",
        "选择文件和文件夹",
        "选择所需文件",
        "检查附件卡与任务范围"
      ]
    },
    {
      "id": "S040",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "图片要配上问题",
      "kind": "prompt",
      "narration": "要提供图片，打开输入区的添加菜单，选择添加照片，选中图片以后先检查预览，再补上问题。例如，请解释框出的这两行提示。图片最适合说明难以描述的位置或现象；如果同时放几张，要指出问的是哪张、哪一块。发送图片只是提供观察材料，不代表模型已经点过图中的按钮，想解释还是想操作，要另外说清楚。",
      "lines": [
        "添加菜单 → 添加照片",
        "先检查选中的图片",
        "指出位置与具体问题"
      ],
      "sourceIds": [
        "D03",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "打开添加菜单",
          "选择添加照片",
          "检查图片预览",
          "说明关注区域"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.contextButton.ariaLabel",
        "steps": [
          "打开添加菜单",
          "选择添加照片",
          "检查图片预览",
          "说明关注区域"
        ]
      },
      "uiRefs": [
        "composer.addPhotos",
        "composer.contextButton.ariaLabel"
      ],
      "steps": [
        "打开添加菜单",
        "选择添加照片",
        "检查图片预览",
        "说明关注区域"
      ]
    },
    {
      "id": "S041",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "@ 是选择对象的入口",
      "kind": "ui",
      "narration": "在支持的输入框里键入 @，可以看到可引用的候选对象，例如文件或资源。先找想要的对象，再从列表中选中，让输入框形成明确的引用。它比只打一个模糊名字更容易指向正确材料。不过不同入口支持的对象并不相同，所以看候选列表的实际内容，不要默认所有 @ 都是在调用技能或连接外部账号。",
      "lines": [
        "输入 @",
        "选择候选对象",
        "确认引用标记"
      ],
      "sourceIds": [
        "D03",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "输入 @",
          "选择候选对象",
          "确认引用标记"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.atMentionList.contextActions"
      },
      "uiRefs": [
        "composer.atMentionList.contextActions"
      ]
    },
    {
      "id": "S042",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "用斜杠发现可用功能",
      "kind": "ui",
      "narration": "想查有哪些快捷操作，先在输入框键入斜杠，候选列表展开以后，继续输入关键词筛选，再点击或选中对应命令。例如输入斜杠 status，可以查看当前聊天的状态信息；模型和计划也有对应命令。先读候选的名称和说明，不需要背整张命令表。如果没有出现网上那个命令，先分清它属于桌面、命令行还是其他产品。",
      "lines": [
        "输入 / 展开命令",
        "继续输入关键词筛选",
        "读说明后选择"
      ],
      "sourceIds": [
        "D06"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "输入 /",
          "键入关键词",
          "选择对应命令",
          "检查发生的界面变化"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "输入 /",
          "键入关键词",
          "选择对应命令",
          "检查发生的界面变化"
        ],
        "clickTarget": "/"
      },
      "steps": [
        "输入 /",
        "键入关键词",
        "选择对应命令",
        "检查发生的界面变化"
      ]
    },
    {
      "id": "S043",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "换行和发送先看设置",
      "kind": "ui",
      "narration": "请求写好以后，先看当前聊天、材料和工作位置，再点击发送。如果想设置回车行为，打开设置，进入常规，选择直接用回车发送，或要求用 Command 加回车发送多行或所有请求。第一次先用一小段文字确认自己的设置，能减少写到一半误发。较长请求用分段表达，比全部堆在一行更容易阅读。",
      "lines": [
        "发送前核对聊天与材料",
        "设置 → 常规",
        "确认回车或组合键行为"
      ],
      "sourceIds": [
        "D04",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "设置中打开常规",
          "确认发送键选项",
          "返回输入框核对材料",
          "点击发送"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "settings.nav.general-settings",
        "steps": [
          "设置中打开常规",
          "确认发送键选项",
          "返回输入框核对材料",
          "点击发送"
        ]
      },
      "uiRefs": [
        "composer.submitButtonTooltip.send",
        "settings.nav.general-settings"
      ],
      "steps": [
        "设置中打开常规",
        "确认发送键选项",
        "返回输入框核对材料",
        "点击发送"
      ]
    },
    {
      "id": "S044",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "听写和发送不是一回事",
      "kind": "ui",
      "narration": "不方便打字时，点击输入区的听写，按提示允许麦克风，再说出请求。声音转成文字后，检查文件名、英文术语和数字。有些状态显示转录并发送，这个按钮会继续提交消息，不能当成只留下草稿。操作前先看标签，再决定是否发送。听写解决的是输入文字，和边说边交流的实时语音聊天，是两种功能。",
      "lines": [
        "点击听写并允许麦克风",
        "检查转录文字",
        "转录并发送会提交消息"
      ],
      "sourceIds": [
        "D03",
        "U01",
        "D24"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "点击听写",
          "完成必要的麦克风授权",
          "检查转录内容",
          "确认当前发送动作"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.dictation.aria",
        "steps": [
          "点击听写",
          "完成必要的麦克风授权",
          "检查转录内容",
          "确认当前发送动作"
        ]
      },
      "uiRefs": [
        "composer.dictation.aria",
        "composer.dictation.submit.aria"
      ],
      "steps": [
        "点击听写",
        "完成必要的麦克风授权",
        "检查转录内容",
        "确认当前发送动作"
      ]
    },
    {
      "id": "S045",
      "chapterId": "C04",
      "chapter": "04 输入框、资料引用与提问",
      "title": "一句话也能清楚",
      "kind": "recap",
      "narration": "我们把输入框的使用收成一句话：请依据这份说明，用普通人能听懂的话解释这个概念，先不要修改文件。这里既有材料，也有输出和范围。并不是每次都需要这么完整，但遇到结果不符合预期时，可以回头检查缺了哪一项。表达清楚的目的，是让你更容易判断和修正结果，而不是写得像命令书。",
      "lines": [
        "材料明确",
        "输出明确",
        "范围明确"
      ],
      "sourceIds": [
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "recap-map",
        "expandItems": [
          "材料明确",
          "输出明确",
          "范围明确"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S046",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "运行以后看什么",
      "kind": "workflow",
      "narration": "发送以后，先关注它正在做哪一类事情：理解请求、读取材料、使用工具，还是等待你的补充。进度信息是帮你了解方向的，不要求你逐行盯着看。如果过程与目标明显不符，例如你只想解释，它却准备修改，就应该及时介入。等它全部做完才发现方向不对，往往会增加检查和恢复的工作。",
      "lines": [
        "理解与读取",
        "工具动作",
        "等待条件"
      ],
      "sourceIds": [
        "D03",
        "D20"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "理解与读取",
          "工具动作",
          "等待条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S047",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "慢不一定是卡住",
      "kind": "concept",
      "narration": "任务没有立刻结束，可能是在进行复杂处理，也可能是在等批准、连接或者必要的信息。先看当前提示，判断有没有明确等待项，再决定继续等还是补充材料。重复点击发送，未必能让原任务更快，反而可能产生新的要求。状态看不懂时，可以把问题缩小为：现在卡在哪一步，需要我提供什么？",
      "lines": [
        "先看状态",
        "再找等待项",
        "避免盲目重试"
      ],
      "sourceIds": [
        "D20"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "concept",
        "expandItems": [
          "先看状态",
          "再找等待项",
          "避免盲目重试"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S048",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "停止控制当前运行",
      "kind": "ui",
      "narration": "如果方向已经偏离，使用停止入口，让当前运行先停下来。发送按钮可能随着状态变化显示成停止、排队或其他标签，它们不是一排永远同时存在的按钮。点击前先看当前状态。停止的目的，是让后续动作不再沿着错误方向继续；它并不自动说明之前读过、改过或发出的内容都已恢复。",
      "lines": [
        "确认当前状态",
        "停止后续动作",
        "已有变化另查"
      ],
      "sourceIds": [
        "U01",
        "D20"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "确认当前状态",
          "停止后续动作",
          "已有变化另查"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.submitButtonTooltip.stop"
      },
      "uiRefs": [
        "composer.submitButtonTooltip.stop"
      ]
    },
    {
      "id": "S049",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "停止之后先查已经做了什么",
      "kind": "workflow",
      "narration": "停止以后，第一步不是立刻说重来，而是看看已经留下了哪些结果。如果只是解释了一半，可以重新提出范围更小的问题；如果已经改了文件，要先查看修改；如果涉及外部服务，就确认动作是否已经发生。只有知道当前状态，才好决定继续、修正还是回退。停止和撤销之间，隔着这一步结果检查。",
      "lines": [
        "看已有结果",
        "确认已发生动作",
        "再决定下一步"
      ],
      "sourceIds": [
        "D20",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "看已有结果",
          "确认已发生动作",
          "再决定下一步"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S050",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "引导是在途中调整方向",
      "kind": "concept",
      "narration": "运行中想马上补充限制，可以在输入框写下调整，并使用显示为引导的提交动作。例如补充说先关注第一部分，其他内容稍后再看。你也可以到设置的常规里，找到运行中消息的后续行为，选择引导当前运行，而不是等待下一轮。发出后看它是否回应并改变方向；已经完成的动作不会因为这条引导自动撤销。",
      "lines": [
        "写下需要立即补充的要求",
        "使用引导动作",
        "观察当前方向是否改变"
      ],
      "sourceIds": [
        "D03",
        "D04",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "输入补充要求",
          "确认提交状态为引导",
          "发送并查看响应"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.submitButtonTooltip.steer",
        "steps": [
          "输入补充要求",
          "确认提交状态为引导",
          "发送并查看响应"
        ]
      },
      "uiRefs": [
        "composer.submitButtonTooltip.steer",
        "settings.nav.general-settings"
      ],
      "steps": [
        "输入补充要求",
        "确认提交状态为引导",
        "发送并查看响应"
      ]
    },
    {
      "id": "S051",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "排队是留到下一轮",
      "kind": "concept",
      "narration": "如果当前工作可以先完成，新要求留到下一轮，在输入框写下内容后，使用排队状态的提交动作。排队完成应能看到等待中的消息；它表示已经安排，不表示已经做完。默认怎样处理运行中的消息，可以到设置的常规里调整后续行为。把需要立即改变方向的要求交给引导，把可以等待的要求放入队列，工作顺序就更清楚。",
      "lines": [
        "可以等的要求放入队列",
        "查看等待中的消息",
        "排队不是已经完成"
      ],
      "sourceIds": [
        "D03",
        "D04",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "输入下一步要求",
          "使用排队动作提交",
          "检查消息处于等待队列"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.submitButtonTooltip.queue",
        "steps": [
          "输入下一步要求",
          "使用排队动作提交",
          "检查消息处于等待队列"
        ]
      },
      "uiRefs": [
        "composer.submitButtonTooltip.queue",
        "settings.nav.general-settings"
      ],
      "steps": [
        "输入下一步要求",
        "使用排队动作提交",
        "检查消息处于等待队列"
      ]
    },
    {
      "id": "S052",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "队列里的消息可以检查",
      "kind": "ui",
      "narration": "在支持的队列界面里，可以查看尚未执行的消息，并使用编辑消息或删除排队的消息等操作。发现要求写错了，或者事情已经不需要做，可以先处理队列。这里影响的是仍在等待的那条消息，不是已经完成的文件动作。操作前确认对象还在队列中，操作后再看列表是否按你的意思变化。",
      "lines": [
        "找到等待中的消息",
        "编辑或删除",
        "确认队列变化"
      ],
      "sourceIds": [
        "D03",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "找到等待中的消息",
          "编辑或删除",
          "确认队列变化"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.queuedMessage.edit"
      },
      "uiRefs": [
        "composer.queuedMessage.edit",
        "composer.queuedMessage.delete"
      ]
    },
    {
      "id": "S053",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "继续要带上下一步",
      "kind": "concept",
      "narration": "某些暂停状态会提供继续入口，普通聊天也可以通过下一条消息接着推进。两种情况都应该先看为什么停下。如果是缺材料，就补材料；如果是批准问题，就先理解请求；如果目标变了，就明确新范围。只发继续，有时会延续原来的理解。加上一句要接着做什么，通常更有帮助，也更容易检查。",
      "lines": [
        "先看暂停原因",
        "补足所需条件",
        "说明继续的方向"
      ],
      "sourceIds": [
        "D03",
        "D20",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "先看暂停原因",
          "补足所需条件",
          "说明继续的方向"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.submitButtonTooltip.resume"
      },
      "uiRefs": [
        "composer.submitButtonTooltip.resume"
      ]
    },
    {
      "id": "S054",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "计划模式先把路看清楚",
      "kind": "ui",
      "narration": "想先讨论步骤，在输入框键入斜杠 plan，选中计划模式里的开启计划模式；看到计划标记后，再发送目标和限制。它会先帮助你理清步骤与需要确认的问题。计划模式是工作方式，不是权限档位，也不意味着绝对不读取文件。适合目标复杂、需要先对齐顺序的时候；只是解释一句话，就不必多加这一层。",
      "lines": [
        "输入 /plan",
        "选择开启计划模式",
        "看到计划标记后发目标"
      ],
      "sourceIds": [
        "D06",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "输入 /plan",
          "选择开启计划模式",
          "确认计划标记出现",
          "发送目标与限制"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.planSlashCommand.title",
        "steps": [
          "输入 /plan",
          "选择开启计划模式",
          "确认计划标记出现",
          "发送目标与限制"
        ]
      },
      "uiRefs": [
        "composer.planSlashCommand.title",
        "composer.planSlashCommand.enableDescription",
        "composer.planModeIndicator"
      ],
      "steps": [
        "输入 /plan",
        "选择开启计划模式",
        "确认计划标记出现",
        "发送目标与限制"
      ]
    },
    {
      "id": "S055",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "从计划到行动要看变化",
      "kind": "workflow",
      "narration": "收到计划后，先检查材料、限制和验收方式有没有漏掉。需要行动时，再输入斜杠 plan，选择关闭计划模式，确认计划标记已经关闭，然后明确发送按刚才确认的步骤开始实施。如果仍有不确定项，就留在计划模式继续讨论。关闭计划模式本身不是执行命令；真正要做什么，还需要下一条明确请求，执行后仍要检查结果。",
      "lines": [
        "先检查计划内容",
        "/plan → 关闭计划模式",
        "明确发出开始实施的请求"
      ],
      "sourceIds": [
        "D03",
        "D06",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "核对计划与限制",
          "输入 /plan 关闭计划模式",
          "确认计划标记关闭",
          "发送明确的实施请求"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "核对计划与限制",
          "输入 /plan 关闭计划模式",
          "确认计划标记关闭",
          "发送明确的实施请求"
        ],
        "clickTarget": "composer.planSlashCommand.title"
      },
      "steps": [
        "核对计划与限制",
        "输入 /plan 关闭计划模式",
        "确认计划标记关闭",
        "发送明确的实施请求"
      ],
      "uiRefs": [
        "composer.planSlashCommand.title",
        "composer.planSlashCommand.disableDescription",
        "composer.planModeIndicator"
      ]
    },
    {
      "id": "S056",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "聊天分支保留另一条思路",
      "kind": "concept",
      "narration": "想从现有讨论分出另一条思路，可以在输入框输入斜杠 fork，选择创建聊天分支，再按提供的选项决定使用新的本地聊天，还是适用的工作树。完成后先确认新聊天名称与工作位置，再继续讨论。聊天分支保留的是另一条对话路线，不等于 Git 分支；选择普通本地聊天，也不能推断磁盘文件自动复制了一套。",
      "lines": [
        "输入 /fork",
        "选择聊天分支的目标",
        "核对新聊天与工作位置"
      ],
      "sourceIds": [
        "D06",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "concept",
        "expandItems": [
          "输入 /fork",
          "选择创建聊天分支",
          "核对分支目标与工作位置",
          "在新聊天继续"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.forkSlashCommand.title",
        "steps": [
          "输入 /fork",
          "选择创建聊天分支",
          "核对分支目标与工作位置",
          "在新聊天继续"
        ]
      },
      "uiRefs": [
        "composer.forkSlashCommand.title"
      ],
      "steps": [
        "输入 /fork",
        "选择创建聊天分支",
        "核对分支目标与工作位置",
        "在新聊天继续"
      ]
    },
    {
      "id": "S057",
      "chapterId": "C05",
      "chapter": "05 运行控制、计划与聊天分支",
      "title": "反馈指出差在哪里",
      "kind": "recap",
      "narration": "结果不合适时，最有效的补充往往很具体：哪一处不对，期待变成什么，修改范围到哪里。例如，这句话太专业，请用生活里的例子解释，其他部分先保持不变。这样比再好一点更容易执行。反馈也可以指出理解问题，而不只是语气问题。先纠正目标和事实，再调整表达，会更接近你真正需要的结果。",
      "lines": [
        "指出具体位置",
        "说明期待",
        "限定修改范围"
      ],
      "sourceIds": [
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "recap-map",
        "expandItems": [
          "指出具体位置",
          "说明期待",
          "限定修改范围"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S058",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "模型是处理任务的选择",
      "kind": "ui",
      "narration": "模型是处理这次请求的能力选择。要切换，在输入框下方找到显示当前模型与推理档位的控件，点击展开选择模型，选好后检查控件上的名称。接下来会认识当前官方使用的名字；实际列表受账号、版本和工作区限制，本章不要求每个人都出现同样选项。模型可以影响复杂任务表现和速度，但不是文件目录，也不是权限设置。",
      "lines": [
        "输入框下方：模型与推理",
        "展开选择模型",
        "选中后核对当前名称"
      ],
      "sourceIds": [
        "D07",
        "U01",
        "D29"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "点击输入框下方模型控件",
          "展开选择模型",
          "选中可用模型",
          "确认显示名称"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.modelPicker.modelList.heading",
        "steps": [
          "点击输入框下方模型控件",
          "展开选择模型",
          "选中可用模型",
          "确认显示名称"
        ]
      },
      "uiRefs": [
        "composer.modelPicker.modelList.heading"
      ],
      "steps": [
        "点击输入框下方模型控件",
        "展开选择模型",
        "选中可用模型",
        "确认显示名称"
      ]
    },
    {
      "id": "S059",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "模型列表会变化",
      "kind": "concept",
      "narration": "当前官方资料里，常见名称包括 GPT 六点一 Sol、GPT 六 Luna 和 GPT 六 Astra。你可以先按用途认识：Luna 适合聚焦、重复的任务；Sol 用于日常到复杂工作之间的选择；Astra 面向要求更高的复杂分析。名字和可用范围会更新，画面保留完整拼写方便对照。初次使用先保留应用当前默认，再根据实际结果调整，不用先背一张固定排名。",
      "lines": [
        "GPT-6 Luna：聚焦与重复",
        "GPT-6.1 Sol：常用到复杂工作",
        "GPT-6 Astra：复杂分析"
      ],
      "sourceIds": [
        "D07",
        "D20",
        "D29"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "以当前列表为准",
          "先理解选择原则",
          "缺少选项先查条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S060",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "简单任务先看是否够用",
      "kind": "concept",
      "narration": "有些版本先显示 Power 调节器，方向是 Faster 和 Smarter，可以理解为偏向更快，或者更深入。这是预设组合，可能同时涉及模型与推理，并不是文件权限。初次先用默认预设；想自己指定，就打开 Advanced，也就是高级选项，再分别选择模型、推理强度和支持的速度设置。简单解释先看是否够用，复杂分析再调整，不必第一次就把所有选项拉到最高。",
      "lines": [
        "Power：选择预设组合",
        "Faster ↔ Smarter",
        "Advanced：分别设置细项"
      ],
      "sourceIds": [
        "D07",
        "T01",
        "D29"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "打开输入框下方模型控件",
          "按需要选择 Power 预设",
          "点 Advanced 查看细项",
          "核对模型与推理组合"
        ],
        "note": "官方文档中的 Power / Advanced 路径示意；另一版直接模型列表分开呈现。",
        "steps": [
          "打开输入框下方模型控件",
          "按需要选择 Power 预设",
          "点 Advanced 查看细项",
          "核对模型与推理组合"
        ],
        "clickTarget": "Advanced（官方文档）"
      },
      "steps": [
        "打开输入框下方模型控件",
        "按需要选择 Power 预设",
        "点 Advanced 查看细项",
        "核对模型与推理组合"
      ]
    },
    {
      "id": "S061",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "推理强度改变的是投入",
      "kind": "ui",
      "narration": "调整投入，在同一个模型控件里打开选择推理强度。可能看到轻度、中、高、极高，以及 Max、Ultra 等档位，不是每个模型都有全部选项。先保持当前默认；需要多步分析再提高，选完核对显示的档位。通常投入越多，等待和用量也会增加；其中 Ultra 还会使用子代理协作，不能只当成普通的慢一档。无论选哪档，都不改变文件权限。",
      "lines": [
        "模型控件 → 选择推理强度",
        "轻度 / 中 / 高 / 极高",
        "Max / Ultra 依模型提供",
        "先用默认，再按需要调整"
      ],
      "sourceIds": [
        "D07",
        "D11",
        "U01",
        "D29"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "展开模型与推理控件",
          "选择推理强度",
          "选择当前模型支持的档位",
          "核对控件显示"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.modelPicker.selectEffort.label",
        "steps": [
          "展开模型与推理控件",
          "选择推理强度",
          "选择当前模型支持的档位",
          "核对控件显示"
        ]
      },
      "uiRefs": [
        "composer.modelPicker.selectEffort.label",
        "composer.mode.local.reasoning.low.label.v2",
        "composer.mode.local.reasoning.medium.label",
        "composer.mode.local.reasoning.high.label",
        "composer.mode.local.reasoning.xhigh.label",
        "composer.mode.local.reasoning.max.label",
        "composer.mode.local.reasoning.ultra.label"
      ],
      "steps": [
        "展开模型与推理控件",
        "选择推理强度",
        "选择当前模型支持的档位",
        "核对控件显示"
      ]
    },
    {
      "id": "S062",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "更高不保证更正确",
      "kind": "concept",
      "narration": "有一个很常见的误解：既然能选更高，就应该永远选最高。实际上，答案是否合适，还取决于材料、目标和检查。缺了关键文件，增加思考也不会凭空补出可靠事实；要求本来模糊，模型可能只是花更多时间理解一个错误方向。所以先把输入补齐，再判断是否需要增加推理投入，通常更合理。",
      "lines": [
        "材料仍然重要",
        "目标仍要清楚",
        "更高不是保证"
      ],
      "sourceIds": [
        "D07",
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "材料仍然重要",
          "目标仍要清楚",
          "更高不是保证"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S063",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "模型和强度一起判断",
      "kind": "concept",
      "narration": "模型与推理强度可以分别看：前者是选择处理能力，后者是调整支持情况下的推理投入。不是每个模型都有完全一样的强度档位。可以用同一类明确问题比较结果，看准确性、表达和等待时间，再选择适合自己的组合。不要一次改变很多条件，否则即使结果变好了，也很难知道到底是哪项调整起了作用。",
      "lines": [
        "先看模型支持",
        "再选推理投入",
        "一次少改几个条件"
      ],
      "sourceIds": [
        "D07"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "先看模型支持",
          "再选推理投入",
          "一次少改几个条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S064",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "四个选项各管什么",
      "kind": "concept",
      "narration": "现在把四个容易混淆的选项放在一起。模型回答由什么能力来处理；推理强度回答投入多少思考；工作位置回答动作在哪里执行；权限回答允许做什么。它们可以共同影响任务，却不能互相替代。比如选本地，不代表模型离线；提高强度，也不等于允许修改更多文件。看到菜单时，先确定自己正在解决哪一个问题。",
      "lines": [
        "模型与推理投入",
        "工作在哪里运行",
        "允许做哪些动作"
      ],
      "sourceIds": [
        "D07",
        "D08",
        "D11"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "模型与推理投入",
          "工作在哪里运行",
          "允许做哪些动作"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S065",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "查看自己的使用情况",
      "kind": "concept",
      "narration": "想看自己还可以使用多少，打开设置，选择使用情况和计费；也可以在支持的聊天里输入斜杠 usage。查看当前账号的限制窗口、用量和重置说明，再判断是否需要等待或调整任务。斜杠 status 则能查看当前聊天的编号、上下文用量和限制信息。不要拿网上某个人的固定数字代替自己的页面，也不要把缺失的信息理解成无限使用。",
      "lines": [
        "设置 → 使用情况和计费",
        "/usage 打开用量设置",
        "/status 查看当前聊天状态"
      ],
      "sourceIds": [
        "D06",
        "U01",
        "D04"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "打开设置",
          "选择使用情况和计费",
          "读取当前窗口与说明"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "settings.nav.usage",
        "steps": [
          "打开设置",
          "选择使用情况和计费",
          "读取当前窗口与说明"
        ]
      },
      "uiRefs": [
        "settings.nav.usage"
      ],
      "steps": [
        "打开设置",
        "选择使用情况和计费",
        "读取当前窗口与说明"
      ]
    },
    {
      "id": "S066",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "慢和用量高要分开排查",
      "kind": "concept",
      "narration": "感觉速度变慢时，先判断任务是不是更复杂、材料是不是更多、推理投入是不是更高，或者正在等待工具与批准。只有模型正在处理，才适合把问题主要归到推理速度上。连接失败、命令卡住和审批等待，是其他类型的问题。分清等待发生在哪一步，才能决定换模型、减少范围，还是补齐外部条件。",
      "lines": [
        "模型处理",
        "工具执行",
        "外部等待"
      ],
      "sourceIds": [
        "D07",
        "D20"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "model-compare",
        "expandItems": [
          "模型处理",
          "工具执行",
          "外部等待"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S067",
      "chapterId": "C06",
      "chapter": "06 模型、推理强度与使用情况",
      "title": "选项判断小测验",
      "kind": "recap",
      "narration": "最后做一个判断：我希望它别修改文件，应该优先把推理强度调低吗？不应该。你需要明确只读的任务要求，并检查实际权限范围；推理强度负责的是另一件事。同样，如果任务只是很简单的解释，也不必为了显得专业，把模型、强度、云端全部换一遍。每次调整，都应该有明确目的。",
      "lines": [
        "不改文件：看范围与权限",
        "分析复杂：再看模型和强度",
        "每次调整有目的"
      ],
      "sourceIds": [
        "D07",
        "D11",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "quiz",
        "expandItems": [
          "不改文件：看范围与权限",
          "分析复杂：再看模型和强度",
          "每次调整有目的"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      },
      "quiz": {
        "question": "想让它不修改文件，应优先降低推理强度吗？",
        "options": [
          "是，思考少就不能修改",
          "不是，应明确范围并检查权限"
        ],
        "answerIndex": 1,
        "explanation": "推理强度影响处理投入，文件操作边界由要求和实际权限共同控制。",
        "pauseAfterText": "最后做一个判断：我希望它别修改文件，应该优先把推理强度调低吗？",
        "pauseSeconds": 5
      }
    },
    {
      "id": "S068",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "权限先看动作和范围",
      "kind": "concept",
      "narration": "权限入口在输入框下方。点击当前权限控件，也就是更改权限，展开后可以看到请求批准、帮我批准、完全访问权限等选项。先看当前选中了哪一项，不要把出现在列表里当成已经启用。版本、环境和组织规则可能限制可选项。本章逐个解释如何选择：它们决定哪些动作可直接进行、哪些需要审查，而不是模型能思考多少。",
      "lines": [
        "输入框下方 → 更改权限",
        "看当前选中项",
        "先理解选项，再改变范围"
      ],
      "sourceIds": [
        "D11",
        "D19"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "点击更改权限",
          "查看批准方式菜单",
          "确认当前选中模式"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "点击更改权限",
          "查看批准方式菜单",
          "确认当前选中模式"
        ],
        "clickTarget": "composer.permissionsDropdown.trigger.tooltip"
      },
      "steps": [
        "点击更改权限",
        "查看批准方式菜单",
        "确认当前选中模式"
      ],
      "uiRefs": [
        "composer.permissionsDropdown.trigger.tooltip",
        "composer.permissionsDropdown.title"
      ]
    },
    {
      "id": "S069",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "要求和系统约束不同",
      "kind": "concept",
      "narration": "你在聊天里写先不要修改文件，这是明确任务范围，很有必要。但它是一条工作要求，不会自动把系统权限切成只读。反过来，系统只允许访问某个目录，也不能因为你一句话就扩大。最好同时理解这两层：用自然语言说清希望怎么做，再用实际权限控制它技术上能做什么，两者一起帮助保持可控。",
      "lines": [
        "任务要求",
        "技术边界",
        "两层一起理解"
      ],
      "sourceIds": [
        "D11",
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "任务要求",
          "技术边界",
          "两层一起理解"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S070",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "沙箱和审批各管一层",
      "kind": "concept",
      "narration": "沙箱可以理解为给执行动作划出的场地边界，比如哪些目录可写、命令能否联网。审批则决定哪些动作需要额外审查。边界内允许的动作，可能直接进行；超出范围时，才可能提出请求。具体规则取决于环境和配置。所以没有弹窗，不一定表示绕过规则；出现弹窗，也要先看它准备扩大哪一项范围。",
      "lines": [
        "沙箱划边界",
        "审批处理请求",
        "规则依环境而定"
      ],
      "sourceIds": [
        "D11",
        "D19"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "沙箱划边界",
          "审批处理请求",
          "规则依环境而定"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S071",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "请求批准看具体请求",
      "kind": "ui",
      "narration": "初学时，可以在更改权限菜单选择请求批准，关闭菜单后确认当前模式已经切换。它允许在工作区范围内进行符合规则的工作，遇到需要额外批准的动作，再交给你判断，不是每次读取都弹窗。请求出现时，读这一次要做什么、涉及哪里、为什么需要，再批准或拒绝。拿不准就让它解释影响，别只把批准当成继续按钮。",
      "lines": [
        "更改权限 → 请求批准",
        "工作区内按规则进行",
        "需要额外权限时人工判断"
      ],
      "sourceIds": [
        "D11",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "打开更改权限",
          "选择请求批准",
          "确认当前模式",
          "出现请求时读动作与范围"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.permissionsDropdown.trigger.tooltip",
        "steps": [
          "打开更改权限",
          "选择请求批准",
          "确认当前模式",
          "出现请求时读动作与范围"
        ]
      },
      "uiRefs": [
        "composer.permissionsDropdown.default.approvalOptionLabel"
      ],
      "steps": [
        "打开更改权限",
        "选择请求批准",
        "确认当前模式",
        "出现请求时读动作与范围"
      ]
    },
    {
      "id": "S072",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "帮我批准不是完全访问",
      "kind": "ui",
      "narration": "希望由自动审查处理符合条件的请求，可以打开更改权限，选择帮我批准，再核对当前模式。它沿用与请求批准相同的工作区沙箱，改变的是由谁审查额外请求，不会把整个电脑自动开放。自动审查也可能拒绝动作；这时先读拒绝原因，再缩小范围或补充说明。需要自己逐项判断时，就切回请求批准。",
      "lines": [
        "更改权限 → 帮我批准",
        "改变审查方式",
        "不扩大工作区沙箱"
      ],
      "sourceIds": [
        "D11",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "打开更改权限",
          "选择帮我批准",
          "确认当前模式",
          "遇到拒绝先读原因"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.permissionsDropdown.trigger.tooltip",
        "steps": [
          "打开更改权限",
          "选择帮我批准",
          "确认当前模式",
          "遇到拒绝先读原因"
        ]
      },
      "uiRefs": [
        "composer.permissionsDropdown.guardianApproval.optionLabel"
      ],
      "steps": [
        "打开更改权限",
        "选择帮我批准",
        "确认当前模式",
        "遇到拒绝先读原因"
      ]
    },
    {
      "id": "S073",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "宽权限和配置都要有理由",
      "kind": "concept",
      "narration": "完全访问权限提供更宽的文件和网络操作范围。确实需要时，从更改权限菜单选择它，并读清确认说明；任务结束后，可以切回请求批准。自定义采用配置文件里的规则，由组织管理则说明个人不能随意覆盖。新手遇到卡住，先弄清缺哪个具体能力，不要只为少弹窗就选最大范围。菜单变灰时，也先看限制说明。",
      "lines": [
        "完全访问：更宽的操作范围",
        "自定义：配置中的规则",
        "由组织管理：个人可能不能改"
      ],
      "sourceIds": [
        "D11",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "打开更改权限",
          "读取所选模式的范围",
          "确认后核对当前模式",
          "需要时切回请求批准"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.permissionsDropdown.trigger.tooltip",
        "steps": [
          "打开更改权限",
          "读取所选模式的范围",
          "确认后核对当前模式",
          "需要时切回请求批准"
        ]
      },
      "uiRefs": [
        "composer.permissionsDropdown.fullAccess.optionLabel",
        "composer.permissionsDropdown.custom.optionLabel",
        "composer.permissionsDropdown.managed.optionLabel"
      ],
      "steps": [
        "打开更改权限",
        "读取所选模式的范围",
        "确认后核对当前模式",
        "需要时切回请求批准"
      ]
    },
    {
      "id": "S074",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "命令请求不要只看长短",
      "kind": "concept",
      "narration": "有时审批内容是一段命令，看起来很陌生。你不必马上读懂每个字符，可以先让它解释：这条命令对哪个目录做什么，会不会写入、删除、下载或发送内容。短命令也可能有重要影响，长命令也可能只是检查。判断依据应该是动作和范围，而不是文字长短，或者终端窗口看起来是不是很专业。",
      "lines": [
        "作用对象",
        "具体动作",
        "可能影响"
      ],
      "sourceIds": [
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "作用对象",
          "具体动作",
          "可能影响"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S075",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "联网有不同的通道",
      "kind": "concept",
      "narration": "联网不是只有一个意思。应用与模型服务通信、搜索网页、执行命令访问网络，以及连接 MCP 服务，都可能走不同的能力和控制路径。因此一个命令网络设置，不能概括所有外部通信。需要传出内容时，先看是哪个工具、连接到哪里、发送哪些材料。允许搜索资料，与允许把某个文件上传到服务，是不同的事情。",
      "lines": [
        "模型与搜索",
        "命令联网",
        "外部服务连接"
      ],
      "sourceIds": [
        "D19"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "模型与搜索",
          "命令联网",
          "外部服务连接"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S076",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "账号授权与动作批准分开",
      "kind": "concept",
      "narration": "连接外部服务时，可能需要你登录并授权。登录确认使用哪个账号，授权说明允许访问哪些内容或能力，随后某些具体动作还可能需要另外批准。这几个步骤不能省成一句已经连上了。例如能够读取资料，不代表允许删除或发送。检查连接时看账号与范围，检查动作时再看它准备真正改变什么。",
      "lines": [
        "使用哪个账号",
        "开放哪些范围",
        "本次执行什么动作"
      ],
      "sourceIds": [
        "D16",
        "D19"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "使用哪个账号",
          "开放哪些范围",
          "本次执行什么动作"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S077",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "读弹窗的四个问题",
      "kind": "checklist",
      "narration": "遇到权限弹窗，可以按四个问题读：做什么，作用于哪里，可能造成什么变化，这次允许的范围有多大。并不是所有界面都有相同的按钮，但这四个问题都适用。看懂以后再选择。如果描述仍然模糊，就让它说明具体对象和预期结果，或者先提供只读的检查方案，再决定是否继续原动作。",
      "lines": [
        "动作是什么",
        "对象和影响",
        "允许范围多大"
      ],
      "sourceIds": [
        "D11",
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "动作是什么",
          "对象和影响",
          "允许范围多大"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S078",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "拒绝以后仍能推进",
      "kind": "workflow",
      "narration": "拒绝某个请求，不代表整个任务永远做不了。可以把范围缩小到一个目录，先查看清单，或者让它只解释当前错误。这样有机会先获得足够信息，再决定后续动作。如果确实缺少必要访问，就应该把缺口说清楚，而不是反复尝试绕过。可控地缩小问题，通常比为了继续而不断扩大权限更有帮助。",
      "lines": [
        "缩小范围",
        "先做只读检查",
        "明确真正缺口"
      ],
      "sourceIds": [
        "D11",
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "缩小范围",
          "先做只读检查",
          "明确真正缺口"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S079",
      "chapterId": "C07",
      "chapter": "07 权限、联网与授权",
      "title": "权限判断再练一次",
      "kind": "recap",
      "narration": "现在判断：给外部服务登录授权后，以后的所有动作就都获准了吗？并不是。连接允许的范围、组织规则和具体动作的审批仍然可能不同。再记住另一点：调高推理强度不增加权限，停止运行也不会自动回滚已发生动作。把这几个边界分开，使用时就更容易看懂提示。",
      "lines": [
        "连接不等于全部动作获批",
        "推理强度不增加权限",
        "停止不自动回滚"
      ],
      "sourceIds": [
        "D11",
        "D16",
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "quiz",
        "expandItems": [
          "连接不等于全部动作获批",
          "推理强度不增加权限",
          "停止不自动回滚"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      },
      "quiz": {
        "question": "外部服务登录授权后，所有后续动作都已经获准吗？",
        "options": [
          "是，连接成功就全部允许",
          "不是，还要看范围、规则与具体动作"
        ],
        "answerIndex": 1,
        "explanation": "账号连接、访问范围和具体动作批准是不同层次。",
        "pauseAfterText": "现在判断：给外部服务登录授权后，以后的所有动作就都获准了吗？",
        "pauseSeconds": 5
      }
    },
    {
      "id": "S080",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "读取和解释可以先进行",
      "kind": "concept",
      "narration": "处理文件时，可以先要求读取并解释，而不是直接修改。例如，请说明这份文件的结构，指出我应该关注哪几部分。这样你先建立理解，再决定是否需要动它。读取、概括和解释都是任务动作，但与写入文件不同。只希望了解情况时，把这一层说清楚，能避免一开始就进入修改流程。",
      "lines": [
        "先理解内容",
        "再判断是否修改",
        "动作范围说清楚"
      ],
      "sourceIds": [
        "D03",
        "D10",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "先理解内容",
          "再判断是否修改",
          "动作范围说清楚"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S081",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "编辑和生成要说清对象",
      "kind": "concept",
      "narration": "编辑通常是改变已有文件，生成则可能创建一份新文件。提出请求时，可以指明希望保留原文件，还是修改指定位置。这里不是要求每次都做备份，而是先弄清产物应该在哪里。收到回复后，检查它给出的路径与文件名，确认实际结果符合要求，不要把聊天里展示的一段内容，直接当成已经保存到磁盘。",
      "lines": [
        "改变已有文件",
        "创建新文件",
        "确认保存位置"
      ],
      "sourceIds": [
        "D03",
        "D10",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "改变已有文件",
          "创建新文件",
          "确认保存位置"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S082",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "从链接定位真实文件",
      "kind": "ui",
      "narration": "结果里出现文件链接时，可以通过它打开对应内容。先看文件名，再看路径，确认没有打开另一份旧文件。有些结果在应用面板中展示，有些需要下载或用适合的程序查看，取决于文件类型和当前入口。无论用哪种方式，检查的是实际产物，而不是只读一遍它对产物的描述。",
      "lines": [
        "打开结果链接",
        "核对名称与路径",
        "检查真实产物"
      ],
      "sourceIds": [
        "D10",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "打开结果链接",
          "核对名称与路径",
          "检查真实产物"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S083",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "导航面板帮助认识材料",
      "kind": "ui",
      "narration": "想找目录里的材料，打开命令菜单，选择显示或隐藏导航面板。面板出现后，逐层展开文件夹，再点击目标文件；先看路径，确认打开的是当前项目里的那一份。这个面板像目录索引，不要求你一开始理解所有文件。它只帮助你定位和打开内容，文件出现在列表里，并不等于模型已经读完，也不表示它已经做过修改。",
      "lines": [
        "命令菜单 → 导航面板",
        "展开目录并选择文件",
        "核对路径与当前项目"
      ],
      "sourceIds": [
        "D05",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "ui-map",
        "expandItems": [
          "打开命令菜单",
          "选择显示或隐藏导航面板",
          "展开目录并点击文件",
          "核对文件路径"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "codex.commandMenuTitle.openCommandMenu",
        "steps": [
          "打开命令菜单",
          "选择显示或隐藏导航面板",
          "展开目录并点击文件",
          "核对文件路径"
        ]
      },
      "uiRefs": [
        "codex.commandMenuTitle.toggleFileTreePanel",
        "codex.commandMenuTitle.openCommandMenu"
      ],
      "steps": [
        "打开命令菜单",
        "选择显示或隐藏导航面板",
        "展开目录并点击文件",
        "核对文件路径"
      ]
    },
    {
      "id": "S084",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "预览解决看见的问题",
      "kind": "ui",
      "narration": "预览让你看到文件的内容或呈现效果，比如文档里的段落、表格里的数据，或者图片的布局。支持哪些预览，取决于文件类型和应用能力。有预览时先检查关键部分；没有预览时，再用合适方式打开原文件。不要因为预览没有自动弹出，就马上认定文件没生成，先确认产物路径是否存在。",
      "lines": [
        "查看内容与呈现",
        "不同文件支持不同",
        "先确认产物路径"
      ],
      "sourceIds": [
        "D10"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "查看内容与呈现",
          "不同文件支持不同",
          "先确认产物路径"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S085",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "呈现正确还要核对内容",
      "kind": "concept",
      "narration": "文件看起来整齐，并不能保证内容正确。数字可能算错，名称可能写错，引用也可能来自旧资料。预览适合发现排版和明显问题，重要事实还要与原始材料对照。检查时先挑决定结果是否可用的部分，而不是只看标题和第一页。把好看与正确分开，会更容易发现需要进一步修改的地方。",
      "lines": [
        "看起来整齐",
        "内容是否准确",
        "对照原始依据"
      ],
      "sourceIds": [
        "D10",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "看起来整齐",
          "内容是否准确",
          "对照原始依据"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S086",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "把反馈放在具体位置",
      "kind": "prompt",
      "narration": "需要修改时，尽量指出具体文件和位置。可以说第二段的解释太抽象，请补一个生活中的例子，其他段落保持原样；如果支持批注，也可以直接标出相关区域。具体位置加上期望变化，会比整体再优化一下容易理解。改完以后，回到同一位置检查，再留意是否影响了相邻内容。",
      "lines": [
        "指出位置",
        "说明期望变化",
        "改后再核对"
      ],
      "sourceIds": [
        "D03",
        "D10"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "指出位置",
          "说明期望变化",
          "改后再核对"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S087",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "原文件和新文件都要辨认",
      "kind": "concept",
      "narration": "有时一次任务会产生多个版本。不要只根据文件名里的最终版三个字判断，最好结合路径、修改时间和内容，确认哪份才是当前结果。你也可以要求它在回复中说明新增了什么、改了什么、文件在哪里。这不是让它多写一篇报告，而是给你一个可追踪的交接，避免下次回来时找错材料。",
      "lines": [
        "确认当前版本",
        "区分新增与修改",
        "记住结果位置"
      ],
      "sourceIds": [
        "D03",
        "D10",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "确认当前版本",
          "区分新增与修改",
          "记住结果位置"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S088",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "检查报告要看范围",
      "kind": "concept",
      "narration": "如果它说已经检查，继续看检查的对象、方法和结果。打开文件看了一遍，与执行自动测试，是不同程度的验证；只检查一部分，也不能代表所有内容都通过。一个有帮助的交接应该把已完成检查和未确认事项分开。遇到没有条件验证的部分，明确保留缺口，比把它包装成全部完成更可靠。",
      "lines": [
        "检查了什么",
        "用什么方法",
        "还有什么没确认"
      ],
      "sourceIds": [
        "D10",
        "D12",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "检查了什么",
          "用什么方法",
          "还有什么没确认"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S089",
      "chapterId": "C08",
      "chapter": "08 阅读文件、编辑与预览",
      "title": "三个动作别混淆",
      "kind": "recap",
      "narration": "最后把停止、回退和归档放在一起。停止针对正在运行的工作；回退针对已经发生的文件变化，需要确定恢复范围；归档主要管理聊天记录，并可能影响关联运行或计划。这些动作不能互相代替。看见一个撤销或移除按钮时，先读它实际作用于什么，不要期待一个按钮把所有过程和外部影响都倒回去。",
      "lines": [
        "停止：当前运行",
        "回退：指定变化",
        "归档：记录与关联状态"
      ],
      "sourceIds": [
        "D12",
        "D20",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "停止：当前运行",
          "回退：指定变化",
          "归档：记录与关联状态"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S090",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "终端是电脑的文字操作台",
      "kind": "concept",
      "narration": "终端可以理解成电脑的文字操作台。聊天框里，你用自然语言说明想做什么；终端里，程序接收符合格式的命令，再返回执行输出。比如检查文件状态，不一定需要打开一排窗口。你不用先背会命令，但要认清自己正在给谁输入。把一句中文请求粘到终端里，它通常不会像聊天助手那样理解。",
      "lines": [
        "聊天框：表达目标",
        "终端：运行命令",
        "先认清输入位置"
      ],
      "sourceIds": [
        "G01",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "mode-compare",
        "clickTarget": "concept-card",
        "expandItems": [
          "聊天框：表达目标",
          "终端：运行命令",
          "先认清输入位置"
        ],
        "highlights": [
          "先认清输入位置"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S091",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "从哪里打开集成终端",
      "kind": "ui",
      "narration": "在桌面应用的聊天面板中，可以从新标签页选择终端，也可以使用打开终端命令。Mac 默认快捷键是 Control 加反引号，反引号通常在数字一附近。这里说的是 Control，不是 Command。快捷键可能被修改，找不到时以当前菜单和快捷键设置为准。打开后先看终端标题，再看正在使用的目录。",
      "lines": [
        "新标签页 → 终端",
        "或使用打开终端命令",
        "先看标题与当前目录"
      ],
      "sourceIds": [
        "G01",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "thread.sidePanel.newTab.terminal.title",
        "codex.command.toggleTerminal"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "menu-expand",
        "clickTarget": "thread.sidePanel.newTab.terminal.title",
        "expandItems": [
          "新标签页 → 终端",
          "或使用打开终端命令",
          "先看标题与当前目录"
        ],
        "highlights": [
          "先看标题与当前目录"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      },
      "steps": [
        "打开当前聊天的面板新标签页",
        "选择终端",
        "确认终端对应的项目与目录"
      ],
      "availabilityNote": "面向 Mac 桌面集成终端；快捷键可按用户设置变化。"
    },
    {
      "id": "S092",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "当前目录决定命令作用在哪里",
      "kind": "demo",
      "narration": "同一条命令，放在不同文件夹执行，结果可能完全不同。终端最重要的信息之一就是当前目录。你可以把它想成自己正站在哪个房间；只说打开这个文件，电脑会先按这个位置寻找。画面中的 pwd 是查看当前位置的短命令，本课只解释它的作用。遇到路径看不懂时，让 Codex 先说明目标文件夹，再运行后续动作。",
      "lines": [
        "先确认当前目录",
        "相对路径从这里计算",
        "看不懂先问清楚"
      ],
      "sourceIds": [
        "G01",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "terminal.workspaceWarning.message"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "ui-focus",
        "clickTarget": "terminal-current-directory",
        "expandItems": [
          "项目目录",
          "当前目录",
          "目标文件"
        ],
        "highlights": [
          "先确认当前目录"
        ],
        "note": "终端教学重绘；pwd 为独立只读示例，未在用户电脑执行。"
      },
      "code": "pwd"
    },
    {
      "id": "S093",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "一条命令通常包含哪些部分",
      "kind": "concept",
      "narration": "看见一长串命令，先不要急着复制。通常可以把它拆成程序名称、动作、选项和目标。拿 git status 来说，前面指明使用 Git，后面要求查看状态。带横杠的内容经常是选项，路径或文件名经常是目标，但具体含义仍要按该命令解释。你可以直接问：请逐段说明这条命令，会读哪些文件，会不会修改内容。",
      "lines": [
        "程序：调用谁",
        "动作与选项：做什么",
        "目标：作用在哪里"
      ],
      "sourceIds": [
        "G01",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "paper-map",
        "clickTarget": "concept-card",
        "expandItems": [
          "程序：调用谁",
          "动作与选项：做什么",
          "目标：作用在哪里"
        ],
        "highlights": [
          "目标：作用在哪里"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      },
      "code": "git status"
    },
    {
      "id": "S094",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "按回车前先分清读与写",
      "kind": "checklist",
      "narration": "终端命令有的只查看信息，有的会写文件、安装依赖或连接外部服务。看起来短，不代表影响小；看起来长，也不一定危险。按回车前，先说清目的、作用目录和预期结果。对于你不认识的删除、覆盖或重写历史命令，先让 Codex 解释具体对象并给出检查方法。不要把网上整段脚本当作普通文字直接粘贴运行。",
      "lines": [
        "目的是什么",
        "会改哪些对象",
        "怎样确认结果"
      ],
      "sourceIds": [
        "G01",
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "checklist",
        "clickTarget": "concept-card",
        "expandItems": [
          "目的是什么",
          "会改哪些对象",
          "怎样确认结果"
        ],
        "highlights": [
          "怎样确认结果"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S095",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "读输出：过程、结果与退出状态",
      "kind": "concept",
      "narration": "命令下面出现的文字叫输出，里面可能混着进度、提醒和错误。不要只找最后一个绿色词，也不要看到红字就认定全部失败。先确认命令是否已经结束，再找它实际完成了什么，以及是否返回错误状态。你可以请 Codex 用三句话解释：这条命令做了什么，哪里没有完成，下一步需要检查什么。输出很长时，保留原始上下文更有帮助。",
      "lines": [
        "是否已经结束",
        "实际完成了什么",
        "还有什么没有完成"
      ],
      "sourceIds": [
        "G01",
        "D20",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "timeline",
        "clickTarget": "concept-card",
        "expandItems": [
          "是否已经结束",
          "实际完成了什么",
          "还有什么没有完成"
        ],
        "highlights": [
          "还有什么没有完成"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S096",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "命令找不到与没有权限",
      "kind": "concept",
      "narration": "两种常见报错要分开看。命令找不到，通常意味着程序未安装，或者当前环境找不到它；没有权限，则可能是文件访问、系统限制或当前执行权限不允许。它们的处理方法不同。先把原始报错交给 Codex，让它检查原因，不要看到失败就安装一遍所有软件，也不要直接改成最高权限。修复以后，再重跑刚才失败的最小一步。",
      "lines": [
        "找不到：检查程序与环境",
        "没权限：检查访问范围",
        "修复后只重试必要一步"
      ],
      "sourceIds": [
        "D20",
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "mode-compare",
        "clickTarget": "concept-card",
        "expandItems": [
          "找不到：检查程序与环境",
          "没权限：检查访问范围",
          "修复后只重试必要一步"
        ],
        "highlights": [
          "修复后只重试必要一步"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S097",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "持续运行不一定是卡住",
      "kind": "concept",
      "narration": "有些命令完成后就退出，有些会一直运行，等待后续事件。比如本地预览服务会持续等待访问，测试监听器会等文件变化。终端没有回到可输入新命令的状态，不一定是卡住。先看它是否说明正在监听、等待输入或者请求确认，再决定要不要停止。如果需要另一条独立命令，可以开新终端，同时记住每个标签正在做什么。",
      "lines": [
        "一次完成的命令",
        "持续等待的进程",
        "新标签要有明确用途"
      ],
      "sourceIds": [
        "G01",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "terminal.tabs.title"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "mode-compare",
        "clickTarget": "terminal.tabs.title",
        "expandItems": [
          "一次完成的命令",
          "持续等待的进程",
          "新标签要有明确用途"
        ],
        "highlights": [
          "新标签要有明确用途"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S098",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "停止终端命令不会撤销结果",
      "kind": "demo",
      "narration": "在常见终端程序中，Control 加 C 用来请求中断当前前台命令。先把焦点点进要停止的那个终端，再按组合键，随后检查程序是否退出。它不等于撤销已经写入的文件，也不保证停止所有后台进程。聊天里的停止按钮则控制代理运行，不能把两者混为一谈。若仍有服务占用端口，让 Codex 定位本任务启动的进程后再处理。",
      "lines": [
        "先选对终端",
        "请求停止前台命令",
        "再检查是否真正退出"
      ],
      "sourceIds": [
        "G01",
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "flow-steps",
        "clickTarget": "terminal-focus",
        "expandItems": [
          "选中目标终端",
          "Control + C",
          "检查退出与残留"
        ],
        "highlights": [
          "停止不是撤销"
        ],
        "note": "终端教学重绘；解释常见前台中断语义，不承诺所有程序均响应。"
      }
    },
    {
      "id": "S099",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "清屏与目录不一致提示",
      "kind": "ui",
      "narration": "终端内容太多时，Control 加 L 可以清理当前显示，方便继续阅读；这不会撤销命令，也不能当作结束进程。另一个更重要的提示是：此终端不在与此聊天关联的工作空间内。出现它，先停下后续输入，核对是不是切换了项目或工作树。界面提供打开新终端的入口，可以回到与聊天关联的位置，避免在旧目录继续操作。",
      "lines": [
        "清屏只整理显示",
        "目录提示需要先核对",
        "必要时打开新终端"
      ],
      "sourceIds": [
        "G01",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "terminal.workspaceWarning.message",
        "terminal.workspaceWarning.openNewTerminal"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "ui-focus",
        "clickTarget": "terminal.workspaceWarning.message",
        "expandItems": [
          "清屏只整理显示",
          "目录提示需要先核对",
          "必要时打开新终端"
        ],
        "highlights": [
          "必要时打开新终端"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S100",
      "chapterId": "C09",
      "chapter": "09 终端从看懂到可控",
      "title": "把重复命令做成明确的动作",
      "kind": "recap",
      "narration": "如果一个项目经常运行同一条检查命令，可以在本地环境中把它配置成动作。动作会出现在应用顶部，并通过集成终端执行，省去重复输入。前提是先知道这条命令确实适合这个项目，不能照抄别人的测试名称。无论手动输入还是点动作，都按同一个顺序判断：在哪个目录，运行什么，是否结束，结果怎样。按钮只是入口，检查过程不能省。",
      "lines": [
        "项目动作复用已知命令",
        "动作仍在终端执行",
        "目录 → 命令 → 结果"
      ],
      "sourceIds": [
        "G01",
        "G02",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "recap",
        "clickTarget": "concept-card",
        "expandItems": [
          "项目动作复用已知命令",
          "动作仍在终端执行",
          "目录 → 命令 → 结果"
        ],
        "highlights": [
          "目录 → 命令 → 结果"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      },
      "availabilityNote": "本地环境动作适用于桌面 Codex；配置后才出现项目动作入口。"
    },
    {
      "id": "S101",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "Git 帮你记录有意义的版本",
      "kind": "concept",
      "narration": "当一个文件改了很多次，你可能会用最终版、最终版二来区分。Git 提供另一种办法：把值得保留的一组修改记录成版本，再比较前后差异。你平时仍然编辑普通文件，不需要把所有内容搬进聊天。版本记录能帮助你了解改动来龙去脉，但它不会替你判断内容对不对，也不会自动保存每一次敲键盘的过程。",
      "lines": [
        "文件仍在项目目录",
        "版本记录便于比较",
        "有记录仍要检查内容"
      ],
      "sourceIds": [
        "D12",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "timeline",
        "clickTarget": "concept-card",
        "expandItems": [
          "文件仍在项目目录",
          "版本记录便于比较",
          "有记录仍要检查内容"
        ],
        "highlights": [
          "有记录仍要检查内容"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S102",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "Git 和 GitHub 不是同一个东西",
      "kind": "concept",
      "narration": "Git 是管理版本的工具，GitHub 则是可以存放远程仓库、讨论修改的服务。你可以只在电脑上使用 Git，不立即上传任何东西。需要团队协作时，再连接有权限访问的远程仓库。界面里出现 Git 功能，不等于已经登录 GitHub；能够打开聊天，也不代表你对某个仓库有推送或合并权限。先分清本机记录和远程服务。",
      "lines": [
        "Git：管理版本",
        "GitHub：远程协作服务",
        "连接和权限另行确认"
      ],
      "sourceIds": [
        "U01",
        "G03",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "mode-compare",
        "clickTarget": "concept-card",
        "expandItems": [
          "Git：管理版本",
          "GitHub：远程协作服务",
          "连接和权限另行确认"
        ],
        "highlights": [
          "连接和权限另行确认"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S103",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "创建 Git 存储库会发生什么",
      "kind": "ui",
      "narration": "如果当前项目还没有使用 Git，变更面板可能提示创建 Git 存储库。这个动作是在选定项目中建立版本管理的基础，不等于创建一个公开的 GitHub 页面，更不等于上传文件。操作前先确认项目根目录，避免把不相关文件夹一起纳入范围。如果你只是阅读或讨论资料，并不需要版本管理，就不必为了消除提示立刻初始化。",
      "lines": [
        "先确认项目根目录",
        "创建本地版本管理",
        "不会因此自动上传"
      ],
      "sourceIds": [
        "D12",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "codex.review.noDiff.gitInit.createRepository"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "ui-focus",
        "clickTarget": "codex.review.noDiff.gitInit.createRepository",
        "expandItems": [
          "先确认项目根目录",
          "创建本地版本管理",
          "不会因此自动上传"
        ],
        "highlights": [
          "不会因此自动上传"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      },
      "availabilityNote": "相关入口只在适用的本地项目状态下出现；初始化后仍需另行提交和配置远程。"
    },
    {
      "id": "S104",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "保存文件与进入版本记录",
      "kind": "concept",
      "narration": "保存文件，只说明新内容写进了当前文件。Git 还会区分已经跟踪的文件、刚出现但尚未纳入记录的文件，以及按忽略规则跳过的文件。忽略常用来排除缓存、临时产物或本机配置，不能理解成文件不存在。提交前要检查文件清单，尤其留意新文件和体积很大的素材。你不想分享的本地配置，不应因为一次全选就被带进版本记录。",
      "lines": [
        "保存：写入当前文件",
        "新文件也要检查",
        "忽略不等于不存在"
      ],
      "sourceIds": [
        "D12",
        "D09",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "file-stack",
        "clickTarget": "concept-card",
        "expandItems": [
          "保存：写入当前文件",
          "新文件也要检查",
          "忽略不等于不存在"
        ],
        "highlights": [
          "忽略不等于不存在"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S105",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "分支是同一历史上的工作方向",
      "kind": "ui",
      "narration": "分支可以理解成给一条修改方向起名字。比如同一个仓库，一条方向用于稳定内容，另一条用于待检查的调整。界面中的切换分支入口，用来确认当前所在方向或选择其他分支。分支名称不是文件夹名称，也不是聊天名称。开始操作前先看当前分支，完成后也确认结果留在哪个分支，避免以为切了聊天就自动切换了版本方向。",
      "lines": [
        "先看当前分支",
        "分支名不是聊天名",
        "切换后再确认位置"
      ],
      "sourceIds": [
        "D09",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "composer.footer.branchSwitch.tooltip"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "ui-focus",
        "clickTarget": "composer.footer.branchSwitch.tooltip",
        "expandItems": [
          "先看当前分支",
          "分支名不是聊天名",
          "切换后再确认位置"
        ],
        "highlights": [
          "切换后再确认位置"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S106",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "新分支与切换前的检查",
      "kind": "ui",
      "narration": "需要独立保留一个修改方向时，可以使用新分支入口。名字最好让人看得出用途，而不是只写一个随意数字。切换前先检查有没有尚未提交的修改，因为这些修改的归属可能需要处理。如果界面提示无法切换，不要把它当作必须清空文件的信号。让 Codex 说明哪些文件阻碍了切换，以及怎样保留当前成果，再选择合适做法。",
      "lines": [
        "新分支写清用途",
        "切换前看未提交修改",
        "遇到阻碍先保留成果"
      ],
      "sourceIds": [
        "D09",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "review.commit.branchTarget.newBranch",
        "composer.footer.branchSwitch.tooltip"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "flow-steps",
        "clickTarget": "review.commit.branchTarget.newBranch",
        "expandItems": [
          "新分支写清用途",
          "切换前看未提交修改",
          "遇到阻碍先保留成果"
        ],
        "highlights": [
          "遇到阻碍先保留成果"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S107",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "暂存是在挑选这次要提交什么",
      "kind": "ui",
      "narration": "一次修改可能涉及好几个文件，但你未必想把它们放进同一个版本。暂存就是先挑出这次准备提交的部分。暂存文件会把对应更改放进暂存区；对文件取消暂存，则把它从这次提交的选择里拿出来。取消暂存通常仍保留工作区中的修改，所以它和还原文件不是一回事。操作后切换已暂存与未暂存视图，检查两边的清单。",
      "lines": [
        "暂存：选入这次提交",
        "取消暂存：移出选择",
        "工作区修改仍需核对"
      ],
      "sourceIds": [
        "D12",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "diff.actionButton.stageFile",
        "diff.actionButton.unstageFile",
        "codex.review.stageFilter.staged"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "mode-compare",
        "clickTarget": "diff.actionButton.stageFile",
        "expandItems": [
          "暂存：选入这次提交",
          "取消暂存：移出选择",
          "工作区修改仍需核对"
        ],
        "highlights": [
          "工作区修改仍需核对"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S108",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "提交信息要说明为什么改",
      "kind": "ui",
      "narration": "提交会为选定内容建立一条本地版本记录。打开提交面板时，先检查文件范围，再读提交信息。好的说明要让之后的自己知道改了什么、为什么改，比如修正日期排序规则，比写修改一下更有用。Codex 可以帮助生成说明，但你仍要核对它有没有夸大结果。看到提交成功后，本机历史已经更新；远程仓库是否变化，还要看有没有另外推送。",
      "lines": [
        "确认提交范围",
        "说明改了什么与原因",
        "提交先更新本地历史"
      ],
      "sourceIds": [
        "D12",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "review.commit.form.commitTitle",
        "review.commit.messageLabel"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "ui-focus",
        "clickTarget": "review.commit.form.commitTitle",
        "expandItems": [
          "确认提交范围",
          "说明改了什么与原因",
          "提交先更新本地历史"
        ],
        "highlights": [
          "提交先更新本地历史"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S109",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "推送把本地提交送到远程",
      "kind": "ui",
      "narration": "推送是把本地分支中的提交发送到配置好的远程仓库。界面可能把提交和推送放在同一个入口里，所以要读清本次动作到底包含哪一步。推送前检查目标仓库、分支以及准备上传的提交。推送成功也只代表远程版本更新，不等于已经合并到主分支，更不等于网站已发布。如果你只想保存本机进度，就明确要求只提交，不推送。",
      "lines": [
        "检查远程仓库与分支",
        "推送会发送本地提交",
        "远程更新不等于发布"
      ],
      "sourceIds": [
        "D09",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "review.commit.form.commitAndPushTitle"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "flow-steps",
        "clickTarget": "review.commit.form.commitAndPushTitle",
        "expandItems": [
          "检查远程仓库与分支",
          "推送会发送本地提交",
          "远程更新不等于发布"
        ],
        "highlights": [
          "远程更新不等于发布"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S110",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "拉取更新与冲突是什么意思",
      "kind": "concept",
      "narration": "多人合作时，远程可能已经有你电脑上没有的新提交。拉取的目的，是把这些更新带到当前工作中；具体怎样衔接历史，要遵循项目约定。冲突表示同一处内容的几种修改无法自动决定如何组合，不代表文件已经全部损坏。先保留当前修改，请 Codex 列出冲突文件和双方意图。确认该保留什么之后再解决，不要用强制推送来掩盖原因。",
      "lines": [
        "先了解远程更新",
        "冲突需要判断双方意图",
        "不要用强推掩盖问题"
      ],
      "sourceIds": [
        "G01",
        "G04",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "before-after",
        "clickTarget": "concept-card",
        "expandItems": [
          "先了解远程更新",
          "冲突需要判断双方意图",
          "不要用强推掩盖问题"
        ],
        "highlights": [
          "不要用强推掩盖问题"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S111",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "Pull Request 是请求检查并合并",
      "kind": "concept",
      "narration": "把一组修改推到远程后，可以创建 Pull Request，常简称 PR，用来请别人检查并讨论是否合并。先看源分支和目标分支，再读标题、说明与文件差异。草稿表示还在准备，标记为可供审查表示邀请检查，两者都不等于已经合并。审核意见、检查状态和项目规则共同影响能否合并。关闭请求也不能理解成删除电脑上的全部文件。",
      "lines": [
        "确认源分支与目标分支",
        "草稿和可供审查是状态",
        "合并需要单独决定"
      ],
      "sourceIds": [
        "D12",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "settings.git.createDraftPullRequest.label",
        "codeReview.menu.ready",
        "codeReview.menu.close"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "timeline",
        "clickTarget": "settings.git.createDraftPullRequest.label",
        "expandItems": [
          "确认源分支与目标分支",
          "草稿和可供审查是状态",
          "合并需要单独决定"
        ],
        "highlights": [
          "合并需要单独决定"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S112",
      "chapterId": "C10",
      "chapter": "10 Git 基础与协作动作",
      "title": "Git 设置改变的是默认习惯",
      "kind": "ui",
      "narration": "设置里的 Git 项目，可以统一分支前缀、提交信息和 Pull Request 描述的生成指令。它们帮助形成一致习惯，不会自动证明某次修改值得提交。还有始终强制推送这类影响较大的选项，它会改变推送方式，不能当作普通的加速开关。新手先保留清楚的版本记录，遇到推送被拒绝先查原因，再与协作者确认如何处理历史。",
      "lines": [
        "前缀：统一命名",
        "指令：统一说明方式",
        "强制推送先理解后使用"
      ],
      "sourceIds": [
        "G04",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "settings.nav.git-settings",
        "settings.git.branchPrefix.label",
        "settings.git.commitInstructions.label",
        "settings.git.forcePush.label"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "menu-expand",
        "clickTarget": "settings.nav.git-settings",
        "expandItems": [
          "前缀：统一命名",
          "指令：统一说明方式",
          "强制推送先理解后使用"
        ],
        "highlights": [
          "强制推送先理解后使用"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S113",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "diff 是前后差异，不是运行结果",
      "kind": "concept",
      "narration": "diff 指的是两个状态之间的差异。你可以把它理解成修改前和修改后的对照表：哪些内容增加了，哪些删除了，哪些保留不动。变更面板帮你缩小检查范围，不必重新阅读全部文件。但它只呈现文件变化，不能证明程序已经运行，更不能证明页面显示正常。先读差异，再用相应检查确认行为，是两种互相补充的工作。",
      "lines": [
        "对比两个状态",
        "聚焦增删与修改",
        "文件差异还要验证行为"
      ],
      "sourceIds": [
        "D12",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "before-after",
        "clickTarget": "concept-card",
        "expandItems": [
          "对比两个状态",
          "聚焦增删与修改",
          "文件差异还要验证行为"
        ],
        "highlights": [
          "文件差异还要验证行为"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S114",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "先选对你正在比较的范围",
      "kind": "ui",
      "narration": "打开变更面板后，第一步不是盯着红绿文字，而是确认查阅来源。未暂存看当前尚未选入提交的修改，已暂存看准备提交的内容，分支看相对比较对象的差异，上一轮则聚焦最近一轮改动。版本可能写最近一轮，不要把两种叫法当成两个常驻功能。同一个文件在不同范围里的结果会不同，所以提问时也要说明你看的范围。",
      "lines": [
        "先看查阅来源",
        "未暂存与已暂存分开",
        "分支与上一轮范围不同"
      ],
      "sourceIds": [
        "D12",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "codex.review.header.source",
        "codex.review.stageFilter.unstaged",
        "codex.review.stageFilter.staged",
        "codex.review.source.local.lastTurn"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "menu-expand",
        "clickTarget": "codex.review.header.source",
        "expandItems": [
          "先看查阅来源",
          "未暂存与已暂存分开",
          "分支与上一轮范围不同"
        ],
        "highlights": [
          "分支与上一轮范围不同"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S115",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "加号减号与上下文一起读",
      "kind": "demo",
      "narration": "差异里常用加号表示新内容，减号表示旧内容被移除。颜色只是辅助，不要把红色直接理解成错误，绿色直接理解成正确。修改一行文字，经常会表现为一行删除加一行新增。阅读时把前后几行一起看，才能知道它位于哪个功能里。如果改动和你的要求对不上，先问这几行为什么需要改变，避免只凭增加行数判断做了多少工作。",
      "lines": [
        "加号：新增内容",
        "减号：移除旧内容",
        "连同上下文理解"
      ],
      "sourceIds": [
        "D12",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "before-after",
        "clickTarget": "diff-context-lines",
        "expandItems": [
          "旧：默认显示全部",
          "新：默认显示已完成",
          "检查是否符合要求"
        ],
        "highlights": [
          "颜色不代表正确或错误"
        ],
        "note": "原创文字差异教学示意，红绿之外同时展示加减号和旧新标签。"
      }
    },
    {
      "id": "S116",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "调整布局帮助自己读懂",
      "kind": "ui",
      "narration": "文件多时，先从变更列表选中一个文件，再展开它的差异。左右对照适合看同一位置的前后内容；窗口较窄时，可以切回自动布局。词级差异突出一行里具体换了什么，自动换行则让长行更容易读。它们都只是改变显示方式，不会替你修改文件。复制路径可以告诉 Codex 你正在讨论哪个文件，避免同名文件造成误会。",
      "lines": [
        "先选中一个文件",
        "拆分或自动布局",
        "词级差异与自动换行"
      ],
      "sourceIds": [
        "D12",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "codex.review.switchToSplit",
        "codex.review.switchToAuto",
        "codex.review.wordDiffs.label",
        "codex.review.wrap.label",
        "codex.review.fileTree.contextMenu.copyPath"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "ui-focus",
        "clickTarget": "codex.review.switchToSplit",
        "expandItems": [
          "先选中一个文件",
          "拆分或自动布局",
          "词级差异与自动换行"
        ],
        "highlights": [
          "词级差异与自动换行"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S117",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "取消暂存和还原，结果完全不同",
      "kind": "checklist",
      "narration": "暂停想一想：你只是暂时不想提交某个文件，应该取消暂存，还是还原文件？答案是取消暂存，它调整这次提交的选择。还原则可能撤销文件里的实际修改，操作前要检查范围和确认提示。范围还可能是一处改动、一个文件，或者全部变更。记不清时先取消操作，让 Codex 解释将丢弃哪些内容，不要通过反复点击来试效果。",
      "lines": [
        "不想提交：取消暂存",
        "不想保留修改：检查还原",
        "先看一处、文件还是全部"
      ],
      "sourceIds": [
        "D12",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "diff.actionButton.unstageFile",
        "diff.actionButton.revertFile",
        "codex.review.revertDialog.title"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "quiz",
        "clickTarget": "diff.actionButton.unstageFile",
        "expandItems": [
          "不想提交：取消暂存",
          "不想保留修改：检查还原",
          "先看一处、文件还是全部"
        ],
        "highlights": [
          "先看一处、文件还是全部"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      },
      "quiz": {
        "question": "只想把文件移出本次提交，选什么？",
        "options": [
          "取消暂存",
          "还原文件"
        ],
        "answerIndex": 0,
        "explanation": "取消暂存调整提交选择；还原可能撤销工作区中的实际修改。",
        "pauseSeconds": 5,
        "pauseAfterText": "暂停想一想：你只是暂时不想提交某个文件，应该取消暂存，还是还原文件？"
      }
    },
    {
      "id": "S118",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "本地审查先选检查对象",
      "kind": "ui",
      "narration": "在 Git 项目的聊天输入框里，可以输入斜杠 review，进入本地代码审查。先选择检查未提交修改，还是与某个基础分支比较，再补充你最关心的行为。比如只检查日期排序和空内容处理，不要顺便重写页面。审查的目标是报告值得核实的问题，本身不会因为提出意见就把文件改好。看完报告后，再明确是否让 Codex 修复。",
      "lines": [
        "Git 项目中使用 /review",
        "先选未提交或分支比较",
        "审查与修复分别确认"
      ],
      "sourceIds": [
        "D12",
        "D06",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "flow-steps",
        "clickTarget": "concept-card",
        "expandItems": [
          "Git 项目中使用 /review",
          "先选未提交或分支比较",
          "审查与修复分别确认"
        ],
        "highlights": [
          "审查与修复分别确认"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      },
      "code": "/review",
      "availabilityNote": "本地 /review 依赖 Git 项目；可用选项随客户端和当前环境变化。"
    },
    {
      "id": "S119",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "读审查意见要找证据",
      "kind": "concept",
      "narration": "审查报告不是越长越好。先看一个问题在什么情况下会发生，再看影响哪些用户，以及指向的文件和行号。优先级帮助安排检查顺序，但不是最终判决。你可以要求 Codex 给出触发条件、预期结果和当前结果，再核对引用的代码。如果它只说可能有问题，却讲不出可验证的情况，就继续追问，不要马上按照每条意见修改。",
      "lines": [
        "触发条件是什么",
        "影响与证据在哪里",
        "先核实，再决定修复"
      ],
      "sourceIds": [
        "D12",
        "G03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "paper-map",
        "clickTarget": "concept-card",
        "expandItems": [
          "触发条件是什么",
          "影响与证据在哪里",
          "先核实，再决定修复"
        ],
        "highlights": [
          "先核实，再决定修复"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S120",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "远程 Pull Request 审查入口",
      "kind": "ui",
      "narration": "本地变更面板检查你当前仓库的状态，代码审查入口则可以围绕远程 Pull Request 工作。按提示连接有访问权限的源码账号，再选择请求或输入链接。打开后先看描述、讨论和检查状态，再看改动文件。使用 Codex 审查代码可以发起进一步分析。账号尚未连接、仓库没有权限，或某项服务仍在预览时，可见入口和能力会有所不同。",
      "lines": [
        "连接有仓库权限的账号",
        "选择或输入 PR 链接",
        "描述 → 文件 → 检查"
      ],
      "sourceIds": [
        "D12",
        "G03",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "codeReview.sidebar.title",
        "codeReview.menu.review",
        "codeReview.menu.github",
        "codeReview.menu.gitlab"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "ui-focus",
        "clickTarget": "codeReview.sidebar.title",
        "expandItems": [
          "连接有仓库权限的账号",
          "选择或输入 PR 链接",
          "描述 → 文件 → 检查"
        ],
        "highlights": [
          "描述 → 文件 → 检查"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      },
      "availabilityNote": "远程源码账号和仓库访问权是前提；官方将 GitLab 的相关支持标为预览，不能照搬 GitHub 的全部能力。"
    },
    {
      "id": "S121",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "标记已查看、写评论与批准",
      "kind": "ui",
      "narration": "标记为已查看，只是帮助记录自己看过哪些文件，不等于批准修改。给本地差异写行内反馈后，还要回到聊天，说明希望 Codex 如何处理。远程 Pull Request 的评论则可能会立即发送给源码服务，所以发送前先核对文件、行号和措辞。批准审查与合并也是独立决定。不要把看过、评论过、已经批准和已经合并混成一个状态。",
      "lines": [
        "已查看：阅读进度",
        "评论：表达具体意见",
        "批准与合并仍是独立动作"
      ],
      "sourceIds": [
        "D12",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "codex.review.fileDiff.markAsViewed"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "timeline",
        "clickTarget": "codex.review.fileDiff.markAsViewed",
        "expandItems": [
          "已查看：阅读进度",
          "评论：表达具体意见",
          "批准与合并仍是独立动作"
        ],
        "highlights": [
          "批准与合并仍是独立动作"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S122",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "测试检查的事情也有层次",
      "kind": "concept",
      "narration": "测试可以理解成让程序面对预先约定的情况，再比较实际结果。一个小规则检查，可能只验证数字是否按预期计算；更完整的流程检查，则会看几个部分配合后是否正常。格式或语法检查又是另一层，它能发现某些写法问题，却不保证业务结果正确。请 Codex 说明项目已有哪几类检查、这次实际运行了哪些，以及还有什么需要人工观察。",
      "lines": [
        "规则检查",
        "配合后的流程检查",
        "格式检查不能替代行为检查"
      ],
      "sourceIds": [
        "G01",
        "G02",
        "D12",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "paper-map",
        "clickTarget": "concept-card",
        "expandItems": [
          "规则检查",
          "配合后的流程检查",
          "格式检查不能替代行为检查"
        ],
        "highlights": [
          "格式检查不能替代行为检查"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S123",
      "chapterId": "C11",
      "chapter": "11 diff、代码审查与测试",
      "title": "把通过与没检查清楚分开",
      "kind": "recap",
      "narration": "看到测试通过，先确认检查对应的是哪一版文件，以及有没有跳过、失败或根本未运行的项目。缺少依赖导致检查启动不了，不能写成通过。修复以后要重跑相关检查，再查看最新差异，避免测试的是旧内容。对于画面、音频或复杂操作，还要补充适合的人工观察。一个清楚的完成说明，应分别写出已验证什么、证据在哪里、还剩哪些限制。",
      "lines": [
        "确认是最新版本",
        "区分通过、失败与未运行",
        "说明证据和剩余限制"
      ],
      "sourceIds": [
        "D12",
        "G01",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "recap",
        "clickTarget": "concept-card",
        "expandItems": [
          "确认是最新版本",
          "区分通过、失败与未运行",
          "说明证据和剩余限制"
        ],
        "highlights": [
          "说明证据和剩余限制"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S124",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "工作树是一份独立的工作目录",
      "kind": "concept",
      "narration": "工作树，英文叫 Worktree，可以理解成从同一个 Git 仓库另开一张工作桌。每张桌面有自己的文件副本，可以处理不同方向，同时共享仓库的版本历史。这样你在一处查看内容，另一处的修改不必直接覆盖眼前的文件。它仍然是磁盘上的目录，不是虚拟电脑，也不会自动把端口、账号和外部服务隔离开。",
      "lines": [
        "自己的文件副本",
        "共享同一仓库历史",
        "不是一台独立电脑"
      ],
      "sourceIds": [
        "D09",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "mode-compare",
        "clickTarget": "concept-card",
        "expandItems": [
          "自己的文件副本",
          "共享同一仓库历史",
          "不是一台独立电脑"
        ],
        "highlights": [
          "不是一台独立电脑"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S125",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "什么时候值得用工作树",
      "kind": "concept",
      "narration": "如果你只做一个顺序任务，在当前项目中工作通常更直接。需要同时比较两种方案、让另一项任务独立进行，或者暂时不动当前文件时，工作树才更有价值。它的前提是项目属于 Git 仓库。创建前还要确定从哪个分支或状态开始，因为新的工作目录不会自动知道你心里认可的是哪个版本。先定起点，再决定分工。",
      "lines": [
        "先判断是否需要并行",
        "Git 仓库是前提",
        "明确从哪个状态开始"
      ],
      "sourceIds": [
        "D09",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "boundary-map",
        "clickTarget": "concept-card",
        "expandItems": [
          "先判断是否需要并行",
          "Git 仓库是前提",
          "明确从哪个状态开始"
        ],
        "highlights": [
          "明确从哪个状态开始"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S126",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "聊天分支、Git 分支和工作树",
      "kind": "concept",
      "narration": "这三个名字容易绕在一起。聊天分支关注对话历史，表示从某处另开一段讨论；Git 分支关注版本方向；工作树关注实际文件放在哪里。复制一段聊天，不一定复制出独立文件夹。同样，在同一个工作树里新建聊天，也可能继续使用同一批文件。需要独立实验时，不能只看聊天标题不同，还要核对它们对应的目录和版本状态。",
      "lines": [
        "聊天分支：对话历史",
        "Git 分支：版本方向",
        "工作树：实际文件目录"
      ],
      "sourceIds": [
        "D06",
        "D09",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "mode-compare",
        "clickTarget": "concept-card",
        "expandItems": [
          "聊天分支：对话历史",
          "Git 分支：版本方向",
          "工作树：实际文件目录"
        ],
        "highlights": [
          "工作树：实际文件目录"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S127",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "新建工作树时逐项确认",
      "kind": "ui",
      "narration": "在新聊天的执行位置中选择工作树，再核对项目和起始分支，然后提交任务。界面可能显示新建本地工作树，连接远程主机时也可能有远程工作树选项，它们对应的执行机器不同。若选择带有本地未提交修改的起点，还要确认哪些修改会带入。创建完成以后，先看关联目录再继续，别只凭聊天出现在侧栏就认为环境已经准备好。",
      "lines": [
        "选择工作树位置",
        "核对项目与起始分支",
        "创建后确认关联目录"
      ],
      "sourceIds": [
        "D09",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "composer.mode.worktreeSegment",
        "composer.mode.newLocalWorktree",
        "composer.mode.remoteWorktree"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "flow-steps",
        "clickTarget": "composer.mode.worktreeSegment",
        "expandItems": [
          "选择工作树位置",
          "核对项目与起始分支",
          "创建后确认关联目录"
        ],
        "highlights": [
          "创建后确认关联目录"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      },
      "availabilityNote": "工作树需要 Git 仓库；远程选项依赖已配置且可用的远程开发环境。"
    },
    {
      "id": "S128",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "并行也要给任务划分范围",
      "kind": "concept",
      "narration": "独立工作树能减少文件互相覆盖，但并行任务仍要约定负责范围。可以让一个任务检查文案，另一个检查测试，同时说明各自允许改哪些文件、需要交付什么。如果两边都大范围整理同一批内容，最后合并时仍可能出现冲突。它们还可能争用同一台电脑的内存、同一个端口或同一个服务账号，所以并行数量要服从实际资源。",
      "lines": [
        "每个任务写清负责范围",
        "约定交付与合并顺序",
        "共享资源仍可能冲突"
      ],
      "sourceIds": [
        "D09",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "boundary-map",
        "clickTarget": "concept-card",
        "expandItems": [
          "每个任务写清负责范围",
          "约定交付与合并顺序",
          "共享资源仍可能冲突"
        ],
        "highlights": [
          "共享资源仍可能冲突"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S129",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "新目录为什么缺少依赖或配置",
      "kind": "concept",
      "narration": "工作树有了代码，不一定就能立即运行。项目依赖、缓存和被忽略的本地配置，可能没有随 Git 检出一起出现。本地环境可以配置初始化步骤，在创建工作树时准备所需环境。当前官方也提供专门规则，选择性复制被忽略的本地文件。先确认缺的是哪一类，再决定安装或复制；涉及账号配置时更要核对目的地，不要把整个旧目录一股脑搬过去。",
      "lines": [
        "代码与运行环境分开",
        "初始化步骤准备依赖",
        "本地配置只按需要复制"
      ],
      "sourceIds": [
        "D09",
        "G02",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "file-stack",
        "clickTarget": "concept-card",
        "expandItems": [
          "代码与运行环境分开",
          "初始化步骤准备依赖",
          "本地配置只按需要复制"
        ],
        "highlights": [
          "本地配置只按需要复制"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      },
      "availabilityNote": "选择性复制忽略文件的 .worktreeinclude 机制针对本地托管工作树；不推定远程或手动 Git 工作树同样支持。"
    },
    {
      "id": "S130",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "交接会移动工作位置",
      "kind": "workflow",
      "narration": "如果想把后台工作带回日常使用的本地目录，可以通过聊天中的交接入口，选择回到本地。反过来也可以把本地聊天交给工作树继续处理。交接会涉及聊天与 Git 状态的转移，不只是换一个显示标签。操作前先检查未提交修改、运行中的进程和需要保留的本地配置。完成后确认新目录与分支状态，再继续运行命令或检查结果。",
      "lines": [
        "交接前检查当前状态",
        "等待移动过程完成",
        "在新位置重新确认"
      ],
      "sourceIds": [
        "D09",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "flow-steps",
        "clickTarget": "official-handoff-entry",
        "expandItems": [
          "工作树",
          "交接",
          "本地目录"
        ],
        "highlights": [
          "确认目录与分支状态"
        ],
        "note": "依据官方文档绘制交接教学示意，不声称本机当前显示此英文按钮。"
      },
      "availabilityNote": "Hand off 为官方说明中的聊天顶部入口；位置与中文措辞未作本机运行时验证。"
    },
    {
      "id": "S131",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "分支已被工作树使用怎么办",
      "kind": "concept",
      "narration": "如果切换时提示某个分支已被另一个工作树使用，通常不是仓库坏了，而是 Git 不允许同一分支同时占用两个工作目录。先找出那个分支正在什么位置，再决定使用交接，或在另一处切换到不同分支。托管工作树也可能处于没有命名分支的提交状态，这不是没有历史。需要长期保留这个修改方向时，再按流程为它创建明确分支。",
      "lines": [
        "先找分支所在目录",
        "不要强行重复占用",
        "需要保留时建立明确分支"
      ],
      "sourceIds": [
        "D09",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "uiRefs": [],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "before-after",
        "clickTarget": "concept-card",
        "expandItems": [
          "先找分支所在目录",
          "不要强行重复占用",
          "需要保留时建立明确分支"
        ],
        "highlights": [
          "需要保留时建立明确分支"
        ],
        "note": "原创概念示意，不代表原生运行结果。"
      }
    },
    {
      "id": "S132",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "同一工作树里开新聊天",
      "kind": "ui",
      "narration": "工作树设置中可以看到已知对话，也可能使用在此工作树中新建聊天。这个动作会给你新的聊天历史，但使用相同文件和分支，所以它适合重新组织讨论，不适合把两项写入任务彻底隔离。开始前可以问一句：这两个聊天是不是指向同一目录？如果答案是同一个，就要像两个人共用一张桌子那样协调，不能同时随意覆盖同一份文件。",
      "lines": [
        "新聊天可以复用同一目录",
        "历史独立不等于文件隔离",
        "并行写入前核对关联"
      ],
      "sourceIds": [
        "D09",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "settings.worktrees.row.newChat",
        "settings.worktrees.row.newChatDescription",
        "settings.worktrees.row.conversations"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "ui-focus",
        "clickTarget": "settings.worktrees.row.newChat",
        "expandItems": [
          "新聊天可以复用同一目录",
          "历史独立不等于文件隔离",
          "并行写入前核对关联"
        ],
        "highlights": [
          "并行写入前核对关联"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S133",
      "chapterId": "C12",
      "chapter": "12 Worktree、并行与交接",
      "title": "清理工作树前确认成果去向",
      "kind": "checklist",
      "narration": "工作树会占用磁盘，设置里提供自动删除旧工作树、保留数量和工作树根目录等选项。清理前先确认成果已经留在需要的分支或其他可靠位置，再核对本地素材和关联聊天。托管工作树有快照与恢复机制，但不要把它理解成所有文件的永久备份。永久工作树和临时托管工作树的清理规则也不同。删除前看清具体目录，避免只按聊天名称判断。",
      "lines": [
        "先确认成果与本地素材",
        "区分托管和永久工作树",
        "删除前核对具体目录"
      ],
      "sourceIds": [
        "D09",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "uiRefs": [
        "settings.worktrees.autoCleanup.label",
        "settings.worktrees.keepCount.label",
        "settings.git.worktreeRoot.label",
        "settings.worktrees.row.delete"
      ],
      "footnote": "森虫虫系列课｜界面教学示意｜资料核对：2026-10-24",
      "visual": {
        "template": "checklist",
        "clickTarget": "settings.worktrees.autoCleanup.label",
        "expandItems": [
          "先确认成果与本地素材",
          "区分托管和永久工作树",
          "删除前核对具体目录"
        ],
        "highlights": [
          "删除前核对具体目录"
        ],
        "note": "界面教学重绘，不是原生界面实录。"
      }
    },
    {
      "id": "S134",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "工作位置回答在哪里做",
      "kind": "concept",
      "narration": "要选动作在哪里执行，先新建 Codex 聊天，再打开输入区的运行位置选择器。官方当前界面用 Work in，也就是工作位置，让你选 This computer 或 Cloud；中文界面也可能显示本地、云端。Git 项目的工作树是另外的隔离选项，不要和云端混成一件事。本章按这些入口讲；可用位置受账号和环境影响，选完都要核对目标。",
      "lines": [
        "新聊天 → 工作位置",
        "This computer / Cloud",
        "工作树另管目录隔离"
      ],
      "sourceIds": [
        "D08",
        "U01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "新建 Codex 聊天",
          "打开 Work in / 工作位置",
          "选择电脑或云端",
          "核对当前目标"
        ],
        "note": "官方文档路径示意；Work in / This computer / Cloud 与本机另一版工作位置菜单分开画。",
        "clickTarget": "Work in（官方文档）",
        "steps": [
          "新建 Codex 聊天",
          "打开 Work in / 工作位置",
          "选择电脑或云端",
          "核对当前目标"
        ]
      },
      "steps": [
        "新建 Codex 聊天",
        "打开 Work in / 工作位置",
        "选择电脑或云端",
        "核对当前目标"
      ]
    },
    {
      "id": "S135",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "本地不等于模型离线",
      "kind": "concept",
      "narration": "选择本地时，相关文件和命令动作围绕当前电脑或所连接主机的工作目录进行。但模型处理请求仍可能依赖在线服务，因此本地两个字不能解释成完全离线。可以把它理解为工作台放在哪里，而不是负责思考的服务安装在哪里。需要断网可用时，必须单独核实对应能力，不能只凭本地标签判断。",
      "lines": [
        "本地是执行位置",
        "模型服务是另一层",
        "不承诺断网可用"
      ],
      "sourceIds": [
        "D08",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "本地是执行位置",
          "模型服务是另一层",
          "不承诺断网可用"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S136",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "本地先认准目录",
      "kind": "concept",
      "narration": "本地工作，先在工作位置里选择这台计算机或本地，再打开选择项目，选已有项目；还没关联目录时，使用打开文件夹指定目标。发送前核对项目名和路径。终端里的相对路径、文件修改和部分命令，都受到工作目录影响。打开多个聊天时，尤其要防止把另一处结果当成当前结果。位置确认正确，再开始读写。",
      "lines": [
        "工作位置 → 本地",
        "选择项目或打开文件夹",
        "发送前核对路径"
      ],
      "sourceIds": [
        "D02",
        "D08",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "选择本地或这台计算机",
          "打开选择项目",
          "选择已有项目或打开文件夹",
          "核对目录后再发送"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "选择本地或这台计算机",
          "打开选择项目",
          "选择已有项目或打开文件夹",
          "核对目录后再发送"
        ],
        "clickTarget": "composer.localCwdDropdown.chooseProject"
      },
      "steps": [
        "选择本地或这台计算机",
        "打开选择项目",
        "选择已有项目或打开文件夹",
        "核对目录后再发送"
      ],
      "uiRefs": [
        "composer.localCwdDropdown.chooseProject",
        "codex.command.openFolder"
      ]
    },
    {
      "id": "S137",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "云端是另一套工作环境",
      "kind": "concept",
      "narration": "启动云端任务，官方路径是新聊天里打开 Work in，选择 Cloud，再打开 Select environment，选择你有权使用的已发布环境；也可以用斜杠 cloud environment 打开环境选择。如果列表没有合适环境，需要先创建或取得共享访问。创建入口是 Select environment 里的 Create environment，准备并发布以后才能作为任务起点。选环境与创建环境，是两个步骤。",
      "lines": [
        "Work in → Cloud",
        "Select environment → 已发布环境",
        "没有环境时先创建或取得访问"
      ],
      "sourceIds": [
        "D08",
        "D06"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "新聊天：Work in → Cloud",
          "打开 Select environment",
          "选择可访问的已发布环境",
          "核对环境后再提交任务"
        ],
        "note": "官方文档路径示意。展示英文原标签与中文释义，不冒充本机运行时界面。",
        "steps": [
          "新聊天：Work in → Cloud",
          "打开 Select environment",
          "选择可访问的已发布环境",
          "核对环境后再提交任务"
        ],
        "clickTarget": "Work in → Cloud（官方文档）"
      },
      "steps": [
        "新聊天：Work in → Cloud",
        "打开 Select environment",
        "选择可访问的已发布环境",
        "核对环境后再提交任务"
      ],
      "code": "/cloud-environment"
    },
    {
      "id": "S138",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "材料不会凭空搬过去",
      "kind": "concept",
      "narration": "把任务切到云端，不代表电脑上的文件、程序和登录状态会自动完整搬过去。需要确认哪些材料已经上传或关联，哪些连接被允许，哪些依赖已经准备好。如果缺少东西，应该列出具体缺口，而不是直接假设原电脑上的一切都可用。云端产生的结果在哪里，也要在任务结束时说明并检查。",
      "lines": [
        "哪些材料已提供",
        "哪些工具已准备",
        "结果在哪里"
      ],
      "sourceIds": [
        "D08",
        "D02"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "哪些材料已提供",
          "哪些工具已准备",
          "结果在哪里"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S139",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "本地与云端按条件选择",
      "kind": "concept",
      "narration": "如果任务依赖当前电脑上的文件或程序，本地通常比较直观；如果你已经有合适的远程任务环境，可以考虑云端。这里没有一个对所有人都正确的答案。先看材料、所需工具、连接和任务持续条件，再选择。不要因为名称听起来更高级就切换，也不要把另一个入口的在线规则直接套到当前任务。",
      "lines": [
        "看材料与工具",
        "看连接与持续条件",
        "选择合适环境"
      ],
      "sourceIds": [
        "D08",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "看材料与工具",
          "看连接与持续条件",
          "选择合适环境"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S140",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "远程计算机是什么",
      "kind": "concept",
      "narration": "远程计算机，是让当前应用连接另一台主机，在那台电脑上工作。先打开设置，进入远程计算机，查看是否已有连接和连接状态；没有连接时，按这个页面提供的设置流程准备主机。连接完成后，回到新聊天的远程入口选择目标，再确认主机、目录和在线状态。它不等于前面选择一个云端环境，也不是只点远程就自动获得另一台电脑。",
      "lines": [
        "设置 → 远程计算机",
        "先确认连接与在线状态",
        "新聊天选择远程目标"
      ],
      "sourceIds": [
        "D08",
        "U01",
        "D04"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "设置中打开远程计算机",
          "查看或完成主机连接设置",
          "新聊天选择远程目标",
          "核对主机与目录"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "settings.nav.chatGptRemotes",
        "steps": [
          "设置中打开远程计算机",
          "查看或完成主机连接设置",
          "新聊天选择远程目标",
          "核对主机与目录"
        ]
      },
      "uiRefs": [
        "settings.nav.chatGptRemotes",
        "composer.mode.remote"
      ],
      "steps": [
        "设置中打开远程计算机",
        "查看或完成主机连接设置",
        "新聊天选择远程目标",
        "核对主机与目录"
      ]
    },
    {
      "id": "S141",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "环境准备不只是文件",
      "kind": "concept",
      "narration": "一个任务能否运行，除了文件，还可能需要某些程序、依赖、环境变量或服务连接。这些组成了运行环境的一部分。比如工作树里的源文件齐了，却没有本地依赖，命令仍然可能失败。看到环境问题时，先问缺的究竟是哪一项，再按项目说明准备；不要把复制文件、安装工具和获得授权混成一个步骤。",
      "lines": [
        "文件与程序",
        "依赖与配置",
        "连接与授权"
      ],
      "sourceIds": [
        "D09",
        "D08"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "文件与程序",
          "依赖与配置",
          "连接与授权"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S142",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "位置选错先停止再确认",
      "kind": "concept",
      "narration": "发现选错工作位置，先点击停止，检查已经产生了哪些文件或外部变化。需要取回刚才的请求，在原聊天的空输入框按向上方向键，取回上一条内容并复制备用。然后再新建聊天，选对目标，粘贴请求并重新核对材料，确认后发送。重点不是尽快重发，而是让新的位置、材料和范围都正确，避免同一个任务在两个地方继续。",
      "lines": [
        "先停止并查已发生变化",
        "在原聊天取回上一条请求",
        "新聊天选正确位置后再发"
      ],
      "sourceIds": [
        "D20",
        "D08"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "停止并检查已有变化",
          "原聊天按上方向键取回请求",
          "复制备用后新建并选对位置",
          "粘贴并核对材料后发送"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "停止并检查已有变化",
          "原聊天按上方向键取回请求",
          "复制备用后新建并选对位置",
          "粘贴并核对材料后发送"
        ],
        "clickTarget": "composer.submitButtonTooltip.stop"
      },
      "steps": [
        "停止并检查已有变化",
        "原聊天按上方向键取回请求",
        "复制备用后新建并选对位置",
        "粘贴并核对材料后发送"
      ],
      "uiRefs": [
        "composer.submitButtonTooltip.stop"
      ]
    },
    {
      "id": "S143",
      "chapterId": "C13",
      "chapter": "13 本地、云端、远程与环境",
      "title": "选择位置的三个问题",
      "kind": "recap",
      "narration": "这一章可以收成三个问题：材料在哪，动作应该在哪发生，结果要保存到哪。如果这三个答案清楚，本地、云端和远程的选择就不容易只是凭感觉。再加上前面讲过的工作树，它解决的是 Git 项目独立目录的问题。它们都属于工作安排，不会自动替你解决权限、依赖或结果正确性。",
      "lines": [
        "材料在哪",
        "动作在哪",
        "结果在哪"
      ],
      "sourceIds": [
        "D08",
        "D09",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "recap-map",
        "expandItems": [
          "材料在哪",
          "动作在哪",
          "结果在哪"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S144",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "技能是一份可复用的方法",
      "kind": "concept",
      "narration": "Skill 通常译作技能，可以把它理解成一份可重复使用的做事说明：什么时候适用、按哪些步骤处理、需要什么材料。有些还带脚本和资源。本章介绍桌面 Codex 的发现、安装和调用方式；账号与版本会影响可见目录，插件内技能与独立技能的管理路径也不同。先记住，它提供方法，不是更换模型，也不是自动取得服务权限。",
      "lines": [
        "什么时候用",
        "按什么方法做",
        "配套资源"
      ],
      "sourceIds": [
        "D13",
        "D15"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "skill-recipe",
        "expandItems": [
          "什么时候用",
          "按什么方法做",
          "配套资源"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S145",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "普通请求与技能的差别",
      "kind": "concept",
      "narration": "如果只是临时解释一句话，在聊天里直接说明通常就够了。如果每次都要按同一套规则整理材料，反复把规则复制进去会很麻烦，这时技能就有价值。两者的差别主要在复用和组织，不在于技能天然更正确。一个写得不清楚的技能，也可能反复产生同样的问题，所以方法本身仍然需要检查。",
      "lines": [
        "一次性要求",
        "稳定重复的规则",
        "复用不等于正确"
      ],
      "sourceIds": [
        "D13",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "skill-recipe",
        "expandItems": [
          "一次性要求",
          "稳定重复的规则",
          "复用不等于正确"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S146",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "什么时候值得找技能",
      "kind": "concept",
      "narration": "一类工作反复做、步骤稳定、输出标准明确，就值得找现成技能。如果没有合适的，也能在技能页选择创建技能，或在 Codex 输入框选择美元符号 skill creator。接着用普通话说明它做什么、何时使用、输出什么，再回答创建器的问题。先让它整理成说明型技能就够，不需要为了叫技能就硬加脚本；创建后还要用小范围例子检查。",
      "lines": [
        "反复使用的方法才值得沉淀",
        "创建技能或 $skill-creator",
        "说清用途、触发与输出"
      ],
      "sourceIds": [
        "D13",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "skill-recipe",
        "expandItems": [
          "技能页选择创建技能",
          "或输入 $skill-creator",
          "说明用途、触发和输出",
          "检查生成的方法"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "技能页选择创建技能",
          "或输入 $skill-creator",
          "说明用途、触发和输出",
          "检查生成的方法"
        ],
        "clickTarget": "skills.appsPage.createSkill"
      },
      "steps": [
        "技能页选择创建技能",
        "或输入 $skill-creator",
        "说明用途、触发和输出",
        "检查生成的方法"
      ],
      "uiRefs": [
        "skills.appsPage.createSkill"
      ],
      "code": "$skill-creator"
    },
    {
      "id": "S147",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "从入口发现技能",
      "kind": "ui",
      "narration": "发现技能，先打开设置中的技能入口，或者扩展管理里的技能分组。在搜索技能输入名称或用途，打开匹配的条目，读详情；查看自己已有的内容，就看已安装区域。先核对用途和来源，再决定调用还是安装。如果条目来自插件，沿插件详情安装；独立技能则用下一幕讲的安装器，这两条路径不要重复做。",
      "lines": [
        "设置 / 扩展管理 → 技能",
        "搜索用途并打开详情",
        "区分独立技能与插件技能"
      ],
      "sourceIds": [
        "D13",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "打开技能分组",
          "在搜索技能输入名称或用途",
          "打开详情查看来源",
          "确认已安装或选择安装路径"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "settings.nav.skills-settings",
        "steps": [
          "打开技能分组",
          "在搜索技能输入名称或用途",
          "打开详情查看来源",
          "确认已安装或选择安装路径"
        ]
      },
      "uiRefs": [
        "settings.nav.skills-settings",
        "skills.appsPage.search.skills",
        "skills.appsPage.section.installedSkillsOverview",
        "skills.appsPage.manageTab.skills"
      ],
      "steps": [
        "打开技能分组",
        "在搜索技能输入名称或用途",
        "打开详情查看来源",
        "确认已安装或选择安装路径"
      ]
    },
    {
      "id": "S148",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "先读用途和来源",
      "kind": "concept",
      "narration": "查看技能时，重点读适用场景、输入要求、执行步骤和来源。它如果带脚本，实际使用时可能执行动作；如果依赖某个服务，也需要那个服务能够连接。不要只凭名字像自己想要的就认为全部条件都满足。先弄清它做什么、需要什么，再判断是否适合当前任务，会比安装后才猜用途更省力。",
      "lines": [
        "适用范围",
        "需要的条件",
        "来源和动作"
      ],
      "sourceIds": [
        "D13",
        "D15"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "skill-recipe",
        "expandItems": [
          "适用范围",
          "需要的条件",
          "来源和动作"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S149",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "独立技能怎么安装",
      "kind": "workflow",
      "narration": "安装独立技能，可以在 Codex 输入框输入美元符号，从候选中选择 skill installer，然后说先列出可安装技能。看过列表与用途后，再明确指定名称安装；画面上的命令是这种写法的示意。安装完，重新输入美元符号搜索技能名，确认能够选到。新技能通常会自动发现；如果没有显示，再检查安装位置，必要时重启应用。",
      "lines": [
        "选择 $skill-installer",
        "先列出技能，再指定安装",
        "安装后用 $ 搜索确认"
      ],
      "sourceIds": [
        "D13"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "输入 $ 并选择 skill-installer",
          "请求列出可安装技能",
          "指定需要安装的名称",
          "用 $ 搜索确认可用"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "输入 $ 并选择 skill-installer",
          "请求列出可安装技能",
          "指定需要安装的名称",
          "用 $ 搜索确认可用"
        ],
        "clickTarget": "$skill-installer"
      },
      "steps": [
        "输入 $ 并选择 skill-installer",
        "请求列出可安装技能",
        "指定需要安装的名称",
        "用 $ 搜索确认可用"
      ],
      "code": "$skill-installer\n请先列出可安装技能及用途。"
    },
    {
      "id": "S150",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "插件中的技能如何获得",
      "kind": "concept",
      "narration": "技能如果属于插件，先在插件目录打开对应详情，检查它包含哪些技能，再点击安装插件。完成后回到技能的已安装区域，或者在输入框用美元符号搜索名称，确认新增能力。插件若还依赖外部账号，继续完成连接与授权。安装能力包和登录服务是不同步骤，不必再把同一个插件技能按独立文件夹重复安装。",
      "lines": [
        "插件详情 → 安装插件",
        "回到已安装技能确认",
        "外部账号另做连接授权"
      ],
      "sourceIds": [
        "D13",
        "D14"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "skill-recipe",
        "expandItems": [
          "打开所属插件详情",
          "选择安装插件",
          "搜索新增技能确认",
          "按需要连接外部账号"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "打开所属插件详情",
          "选择安装插件",
          "搜索新增技能确认",
          "按需要连接外部账号"
        ],
        "clickTarget": "plugins.card.installTooltip"
      },
      "steps": [
        "打开所属插件详情",
        "选择安装插件",
        "搜索新增技能确认",
        "按需要连接外部账号"
      ],
      "uiRefs": [
        "plugins.card.installTooltip",
        "skills.appsPage.section.installedSkillsOverview"
      ]
    },
    {
      "id": "S151",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "明确指定要用哪个技能",
      "kind": "ui",
      "narration": "明确调用技能，在 Codex 输入框键入美元符号，继续输入技能名筛选，从候选里选中它，再写这次要处理什么、依据什么材料，最后发送。选择以后检查引用名称，避免选中同名但来源不同的技能。桌面命令列表也可能显示已启用技能。这里讲的是 Codex 的美元符号入口；其他 ChatGPT 表面的引用方式，不必照搬到这里。",
      "lines": [
        "输入 $ 并筛选技能",
        "选中后补充本次任务",
        "核对名称，再发送"
      ],
      "sourceIds": [
        "D06",
        "D13",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "输入 $",
          "输入名称并选择技能",
          "补充目标与材料",
          "核对引用并发送"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "输入 $",
          "输入名称并选择技能",
          "补充目标与材料",
          "核对引用并发送"
        ],
        "clickTarget": "$"
      },
      "steps": [
        "输入 $",
        "输入名称并选择技能",
        "补充目标与材料",
        "核对引用并发送"
      ],
      "code": "$技能名\n请依据这份材料，按该方法检查。"
    },
    {
      "id": "S152",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "自动匹配也需要判断",
      "kind": "concept",
      "narration": "技能也可能根据名称、描述和任务内容被自动匹配。这让你不必每次都手动点选，但不意味着所有已安装技能都会同时执行。结果方向不符合预期时，可以要求说明用了哪种方法，或者明确指定更合适的技能。描述越清楚，匹配越容易；技能之间职责重叠时，更需要把当前目标讲具体。",
      "lines": [
        "按任务匹配方法",
        "不等于全部执行",
        "必要时明确指定"
      ],
      "sourceIds": [
        "D13"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "skill-recipe",
        "expandItems": [
          "按任务匹配方法",
          "不等于全部执行",
          "必要时明确指定"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S153",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "启用、停用和移除不同",
      "kind": "concept",
      "narration": "停用技能，先辨认它来自哪里。插件内的技能，到插件卡片的管理菜单选择禁用；独立本地技能，官方做法是在配置文件中给该技能添加配置项，填写技能文件的完整路径，再把启用值设为 false，保存后重启。画面列出字段，不需要现在背。改完重新检查可用列表；停用不是卸载，更不会撤销过去已经完成的文件动作。",
      "lines": [
        "插件技能：管理 → 禁用",
        "独立技能：按路径配置停用",
        "保存重启后检查状态"
      ],
      "sourceIds": [
        "D13",
        "D14",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "skill-recipe",
        "expandItems": [
          "辨认技能来源",
          "插件用管理菜单禁用",
          "独立技能配置 enabled = false",
          "保存重启并检查"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "辨认技能来源",
          "插件用管理菜单禁用",
          "独立技能配置 enabled = false",
          "保存重启并检查"
        ],
        "clickTarget": "plugins.card.manage"
      },
      "steps": [
        "辨认技能来源",
        "插件用管理菜单禁用",
        "独立技能配置 enabled = false",
        "保存重启并检查"
      ],
      "uiRefs": [
        "plugins.card.manage",
        "plugins.card.disableMenuItem"
      ],
      "code": "# ~/.codex/config.toml\n[[skills.config]]\npath = \"/完整路径/技能名/SKILL.md\"\nenabled = false"
    },
    {
      "id": "S154",
      "chapterId": "C14",
      "chapter": "14 Skill 的发现与使用",
      "title": "技能也要检查结果",
      "kind": "recap",
      "narration": "使用技能以后，检查方法和结果是否符合你的要求：材料有没有选对，步骤有没有遗漏，产物是否按预期呈现。如果技能本身有不合适的规则，可以调整方法，再用小范围例子检验。它的作用是减少重复交代，不是替你取消判断。学会查看用途、调用方式和结果，你就已经掌握了技能最重要的基础。",
      "lines": [
        "检查材料",
        "检查步骤",
        "检查产物"
      ],
      "sourceIds": [
        "D13",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "recap-map",
        "expandItems": [
          "检查材料",
          "检查步骤",
          "检查产物"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S155",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "插件是把能力装成一个包",
      "kind": "concept",
      "narration": "插件是便于安装和分发的一组能力。里面可能有技能、外部工具连接，也可能有相应界面。这一章先讲插件目录，再讲直接添加 MCP 服务；两者都受账号、版本和组织设置影响。你看到目录以后，先读它包含什么，再决定是否安装。插件数量多不等于模型更强，也不代表每个外部账号都已经登录。",
      "lines": [
        "技能和连接等能力",
        "统一安装与管理",
        "先看包里有什么"
      ],
      "sourceIds": [
        "D14",
        "D15"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "技能和连接等能力",
          "统一安装与管理",
          "先看包里有什么"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S156",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "目录里先看详情",
      "kind": "ui",
      "narration": "找插件，打开设置中的插件，或扩展管理的插件分组，在搜索插件输入名称或用途，打开条目详情。先看来源、功能和需要连接的服务，再点击安装插件。如果某个关键功能依赖你没有的账号，先识别这个条件。搜索结果名称相似时，要用详情区分，避免装上以后才发现它做的并不是你要的事情。",
      "lines": [
        "插件分组 → 搜索插件",
        "打开详情看功能与来源",
        "需要时点击安装插件"
      ],
      "sourceIds": [
        "D14",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "打开插件分组",
          "搜索名称或用途",
          "打开详情核对来源",
          "选择安装插件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "settings.nav.plugins-settings",
        "steps": [
          "打开插件分组",
          "搜索名称或用途",
          "打开详情核对来源",
          "选择安装插件"
        ]
      },
      "uiRefs": [
        "skills.appsPage.search.plugins",
        "settings.nav.plugins-settings",
        "plugins.card.installTooltip"
      ],
      "steps": [
        "打开插件分组",
        "搜索名称或用途",
        "打开详情核对来源",
        "选择安装插件"
      ]
    },
    {
      "id": "S157",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "安装成功之后还要看什么",
      "kind": "concept",
      "narration": "点击安装插件，是把这个能力包加入应用的过程。完成后，可以到已安装或管理区域确认状态，并按提示处理所需连接。有的新增能力需要在新的聊天里使用才会被加载。插件更新也可能改变规则和工具，所以更新后如果行为明显变化，先看说明与连接状态，不要默认旧任务的全部条件都保持不变。",
      "lines": [
        "确认安装状态",
        "补足所需连接",
        "查看更新后的条件"
      ],
      "sourceIds": [
        "D14",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "确认安装状态",
          "补足所需连接",
          "查看更新后的条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "plugins.card.installTooltip"
      },
      "uiRefs": [
        "plugins.card.installTooltip"
      ]
    },
    {
      "id": "S158",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "禁用和卸载各有什么用",
      "kind": "ui",
      "narration": "暂时不用某个插件，先在已安装的插件卡片上点击管理，再选禁用；确定不再需要安装时，才选卸载。操作后回到列表，检查状态已经改变。禁用会影响当前可用能力，卸载移除安装，但都不等于删除外部服务里过去产生的内容。账号连接是否还保留，要到相应的连接管理另行核对。",
      "lines": [
        "已安装插件 → 管理",
        "暂不用：禁用",
        "移除安装：卸载"
      ],
      "sourceIds": [
        "D14",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "找到已安装插件卡片",
          "点击管理",
          "选择禁用或卸载",
          "核对列表状态"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "plugins.card.manage",
        "steps": [
          "找到已安装插件卡片",
          "点击管理",
          "选择禁用或卸载",
          "核对列表状态"
        ]
      },
      "uiRefs": [
        "plugins.card.manage",
        "plugins.card.disableMenuItem",
        "plugins.card.uninstallMenuItem"
      ],
      "steps": [
        "找到已安装插件卡片",
        "点击管理",
        "选择禁用或卸载",
        "核对列表状态"
      ]
    },
    {
      "id": "S159",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "MCP 是连接方式",
      "kind": "concept",
      "narration": "MCP 的全称你不需要背下来，先记住它是一种让代理接入工具和数据的协议方式。比如某个服务通过它提供查找资料或执行操作的能力，代理就可以按规则调用。它不是一个让模型更聪明的开关，也不是某家服务的同义词。具体能做什么，取决于连接的服务器提供什么，以及账号允许使用什么。",
      "lines": [
        "连接工具和数据",
        "能力由服务提供",
        "访问由授权决定"
      ],
      "sourceIds": [
        "D16"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "连接工具和数据",
          "能力由服务提供",
          "访问由授权决定"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S160",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "服务器可以在本地或远端",
      "kind": "concept",
      "narration": "添加 MCP 时会遇到两种连接类型。STDIO 是由一条启动命令运行本地程序，所以要准备服务给出的命令和必要参数；Streamable HTTP 是通过远程地址连接，所以要准备官方服务地址。服务器不一定代表你要租机器。先按服务说明选择类型，再填写相应信息，不要把地址放进命令栏，也不要把网上任意一条命令当成通用答案。",
      "lines": [
        "STDIO：本地启动命令",
        "Streamable HTTP：服务地址",
        "按服务说明选择类型"
      ],
      "sourceIds": [
        "D16"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "查服务官方连接说明",
          "确定本地命令或远程地址",
          "准备对应参数与认证条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "查服务官方连接说明",
          "确定本地命令或远程地址",
          "准备对应参数与认证条件"
        ],
        "clickTarget": "STDIO / Streamable HTTP（官方文档）"
      },
      "steps": [
        "查服务官方连接说明",
        "确定本地命令或远程地址",
        "准备对应参数与认证条件"
      ]
    },
    {
      "id": "S161",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "到哪里管理连接",
      "kind": "ui",
      "narration": "官方的桌面添加路径很明确：打开 Settings，也就是设置，选择 MCP servers，再点击 Add server。填一个便于辨认的名称，选择本地命令或远程地址的类型，填入服务信息，保存后点击 Restart。画面用官方路径带你认识这些步骤。若你的版本把它合并在插件管理里，就从 MCP 分组查看对应服务；不要把两个界面的布局硬拼在一起。",
      "lines": [
        "Settings → MCP servers",
        "Add server → 名称与连接类型",
        "Save → Restart"
      ],
      "sourceIds": [
        "D16",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "Settings → MCP servers",
          "选择 Add server",
          "填写名称、类型和命令或 URL",
          "Save 后选择 Restart"
        ],
        "note": "官方文档路径示意，非本机点击实录；英文标签保留原文。插件管理版本另示入口，不混画。",
        "clickTarget": "Settings → MCP servers（官方文档）",
        "steps": [
          "Settings → MCP servers",
          "选择 Add server",
          "填写名称、类型和命令或 URL",
          "Save 后选择 Restart"
        ]
      },
      "uiRefs": [
        "settings.nav.mcp-settings"
      ],
      "steps": [
        "Settings → MCP servers",
        "选择 Add server",
        "填写名称、类型和命令或 URL",
        "Save 后选择 Restart"
      ]
    },
    {
      "id": "S162",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "四个状态逐项确认",
      "kind": "workflow",
      "narration": "保存以后，回到服务器列表检查是否启用，以及是否提示需要认证。然后在输入框输入斜杠 mcp，打开连接状态，看看服务是否出现在当前聊天。可以按四层检查：配置或插件已安装，服务已开启，账号已认证，工具能被调用。某一层成功，不代表四层都完成；找不到能力时先定位卡在哪层，比反复重新安装更有效。",
      "lines": [
        "服务器列表检查启用状态",
        "有认证提示就完成登录",
        "/mcp 查看当前连接"
      ],
      "sourceIds": [
        "D14",
        "D16",
        "D06"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "回服务器列表查看状态",
          "检查是否需要认证",
          "输入 /mcp",
          "确认当前连接与可用工具"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "回服务器列表查看状态",
          "检查是否需要认证",
          "输入 /mcp",
          "确认当前连接与可用工具"
        ],
        "clickTarget": "/mcp"
      },
      "steps": [
        "回服务器列表查看状态",
        "检查是否需要认证",
        "输入 /mcp",
        "确认当前连接与可用工具"
      ],
      "code": "/mcp"
    },
    {
      "id": "S163",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "认证走服务自己的流程",
      "kind": "concept",
      "narration": "需要登录的服务，点击 Authenticate，也就是认证，进入服务自己的登录流程，确认账号和授权范围。完成后回到服务器列表，再用斜杠 mcp 检查连接状态。认证成功可以先做一个明确的读取请求，验证是否访问到了指定材料。密码和密钥不要贴进普通聊天；若服务使用密钥，按照提供方要求放在指定凭据位置。",
      "lines": [
        "点击 Authenticate",
        "核对服务账号与授权范围",
        "返回后用 /mcp 检查"
      ],
      "sourceIds": [
        "D16",
        "D19",
        "D06"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "在服务项选择 Authenticate",
          "完成服务的登录授权",
          "返回连接列表确认",
          "用 /mcp 检查状态"
        ],
        "note": "官方 MCP OAuth 流程示意；不伪造所有服务都要求认证或具有相同登录页面。",
        "steps": [
          "在服务项选择 Authenticate",
          "完成服务的登录授权",
          "返回连接列表确认",
          "用 /mcp 检查状态"
        ],
        "clickTarget": "Authenticate（官方文档）"
      },
      "steps": [
        "在服务项选择 Authenticate",
        "完成服务的登录授权",
        "返回连接列表确认",
        "用 /mcp 检查状态"
      ]
    },
    {
      "id": "S164",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "看工具实际提供什么",
      "kind": "concept",
      "narration": "连接成功以后，还要看工具的实际作用。有的只能查询，有的允许创建或修改内容；同一服务里的不同工具也可能有不同权限。你可以先让它说明可用能力，或者从明确的读取请求开始。读取到了信息，不能推出所有写入动作也被允许。判断一个请求时，依然要把工具、对象和可能造成的变化放在一起看。",
      "lines": [
        "查询能力",
        "创建或修改能力",
        "每个动作单独判断"
      ],
      "sourceIds": [
        "D16",
        "D19"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "查询能力",
          "创建或修改能力",
          "每个动作单独判断"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S165",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "在聊天里用连接能力",
      "kind": "prompt",
      "narration": "使用连接工具时，仍然可以自然说话，但要把对象指清楚。例如，请读取这个链接里的说明，概括三个要点。服务是否能访问该链接，取决于账号和工具能力；不能读取时，应说明缺口，而不是编造内容。结果出来后，核对来源和范围，确认确实用了你指定的材料，而不只是给了一段泛泛的回答。",
      "lines": [
        "明确服务与对象",
        "核对访问结果",
        "检查来源"
      ],
      "sourceIds": [
        "D16",
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "明确服务与对象",
          "核对访问结果",
          "检查来源"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S166",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "失效时先看哪一步",
      "kind": "concept",
      "narration": "连接突然不能用，先输入斜杠 mcp 看状态，再回设置的 MCP 服务器或对应插件管理，检查服务是否启用、认证是否过期。远程服务核对地址，本地服务核对程序和启动命令。暂时不用就停用对应服务或插件，并确认状态变化。把连接失败、认证失败和某个工具动作失败分开，才能决定该重新登录、修配置，还是改这次请求。",
      "lines": [
        "先用 /mcp 查连接状态",
        "再查启用、认证和配置",
        "区分连接失败与动作失败"
      ],
      "sourceIds": [
        "D16",
        "D20",
        "D06"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mcp-bridge",
        "expandItems": [
          "输入 /mcp",
          "打开对应服务管理",
          "检查启用、认证与连接信息",
          "处理明确的失败原因"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "steps": [
          "输入 /mcp",
          "打开对应服务管理",
          "检查启用、认证与连接信息",
          "处理明确的失败原因"
        ],
        "clickTarget": "/mcp"
      },
      "steps": [
        "输入 /mcp",
        "打开对应服务管理",
        "检查启用、认证与连接信息",
        "处理明确的失败原因"
      ]
    },
    {
      "id": "S167",
      "chapterId": "C15",
      "chapter": "15 插件、MCP 与服务连接",
      "title": "三者关系再对照",
      "kind": "recap",
      "narration": "做个小判断：要使用一个 Skill，是不是必须先连接 MCP？不一定，技能可以独立提供做事方法。再把三者放在一起：技能告诉代理按什么方法做，MCP 提供实际工具和数据的连接方式，插件把这些能力打包，方便安装和管理。技能可以没有 MCP，插件也不一定包含同样的东西。装了一个插件，更不代表外部账号已经授权。看清方法、工具和包装这三层，后面遇到新扩展就知道该问哪些问题。",
      "lines": [
        "Skill：方法说明",
        "MCP：工具连接",
        "插件：打包分发"
      ],
      "sourceIds": [
        "D13",
        "D14",
        "D15",
        "D16"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "quiz",
        "expandItems": [
          "Skill：方法说明",
          "MCP：工具连接",
          "插件：打包分发"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      },
      "quiz": {
        "question": "使用 Skill 一定要先连接 MCP 吗？",
        "options": [
          "一定需要",
          "不一定，技能可以独立提供方法"
        ],
        "answerIndex": 1,
        "explanation": "Skill 提供方法，MCP 提供工具连接；是否需要组合由技能实际依赖决定。",
        "pauseAfterText": "做个小判断：要使用一个 Skill，是不是必须先连接 MCP？",
        "pauseSeconds": 5
      }
    },
    {
      "id": "S168",
      "chapterId": "C16",
      "chapter": "16 Hooks：事件触发的动作",
      "title": "Hooks：在指定时刻做一件事",
      "kind": "concept",
      "narration": "接下来认识 Hooks，中文界面可能写作钩子。你可以把它想成工作流程里的门铃：某个指定事件发生，就触发事先准备的动作。例如工具执行前检查条件，或者一轮工作准备结束时做校验。本章先讲本地 Codex，云端调度的支持范围另有条件。普通用户先看懂来源、触发条件和影响，再决定是否启用；日常聊天并不要求先配置钩子。",
      "lines": [
        "指定事件发生",
        "触发预先配置的动作",
        "先理解，再决定是否需要"
      ],
      "sourceIds": [
        "P01",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "flow-steps",
        "expandItems": [
          "指定事件发生",
          "触发预先配置的动作",
          "先理解，再决定是否需要"
        ],
        "highlights": [
          "先理解，再决定是否需要"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "availabilityNote": "本章主要解释本地 Codex 的 Hook。云端调度中的 dots / Work Cloud 只在相应组织与管理配置下支持指定的远程 MCP Hooks，不自动继承本机所有钩子。"
    },
    {
      "id": "S169",
      "chapterId": "C16",
      "chapter": "16 Hooks：事件触发的动作",
      "title": "先读懂事件名称",
      "kind": "concept",
      "narration": "钩子名称往往是英文。先按时间顺序看：SessionStart 表示会话开始；PreToolUse 是工具使用前；PostToolUse 是工具使用后；Stop 对应本轮回答准备结束时，不是用户点击停止按钮。它们不是四个要依次点击的按钮，而是程序报告的不同时间点。选错事件，就像把下班提醒设成了每次开门都响。同一个动作需要在哪一步发生，要先说清，再选事件；更细的事件以当前文档为准。",
      "lines": [
        "会话开始：SessionStart",
        "工具前后：Pre / PostToolUse",
        "一轮结束：Stop"
      ],
      "sourceIds": [
        "P01",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "timeline",
        "expandItems": [
          "会话开始：SessionStart",
          "工具前后：Pre / PostToolUse",
          "一轮结束：Stop"
        ],
        "highlights": [
          "一轮结束：Stop"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "settings.hooks.event.sessionStart",
        "settings.hooks.event.preToolUse",
        "settings.hooks.event.postToolUse",
        "settings.hooks.event.stop"
      ]
    },
    {
      "id": "S170",
      "chapterId": "C16",
      "chapter": "16 Hooks：事件触发的动作",
      "title": "匹配器和处理器分别管什么",
      "kind": "concept",
      "narration": "一个钩子还要回答两件事。匹配器决定哪些情况算命中，比如只关心某一类工具；处理器决定命中后执行什么。当前文档支持命令和 MCP 工具两类处理器。你可能在配置或标签里遇到 prompt、agent 等字样，本次核对时它们会被解析，但不会执行，不能因为看见名字就当成可用功能。让 Codex 解释配置时，最好让它逐项说出事件、条件、动作和预期结果。",
      "lines": [
        "事件：什么时候",
        "匹配器：哪些情况",
        "处理器：具体执行什么"
      ],
      "sourceIds": [
        "P01",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "paper-map",
        "expandItems": [
          "事件：什么时候",
          "匹配器：哪些情况",
          "处理器：具体执行什么"
        ],
        "highlights": [
          "处理器：具体执行什么"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "settings.hooks.event.matcher",
        "settings.hooks.event.hookType",
        "settings.hooks.event.command",
        "settings.hooks.event.server"
      ]
    },
    {
      "id": "S171",
      "chapterId": "C16",
      "chapter": "16 Hooks：事件触发的动作",
      "title": "钩子页面：来源、命令和信任",
      "kind": "ui",
      "narration": "如果设置里有“钩子”页，可以先看来源，再看匹配器、命令或 MCP 服务器，最后看超时。这里的“信任”有实际含义：你接受这份具体定义运行。先让 Codex 用普通话解释它会读什么、写什么、是否联网。配置改动后可能需要重新审阅。“重新加载钩子”用于重新读取配置，不等于已经执行成功。命令行另有钩子管理入口，别把命令行教程中的按法直接套进桌面。",
      "lines": [
        "来源 → 条件 → 动作",
        "信任前先看具体定义",
        "重新加载 ≠ 执行成功"
      ],
      "sourceIds": [
        "P01",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "来源 → 条件 → 动作",
          "信任前先看具体定义",
          "重新加载 ≠ 执行成功"
        ],
        "highlights": [
          "重新加载 ≠ 执行成功"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "settings.nav.hooks-settings",
        "settings.hooks.refresh",
        "settings.hooks.event.source",
        "settings.hooks.event.trust",
        "settings.hooks.event.timeout"
      ],
      "steps": [
        "打开设置中的钩子（若可见）",
        "检查来源、命令和影响范围",
        "审阅后信任具体定义",
        "通过运行记录核对结果"
      ]
    },
    {
      "id": "S172",
      "chapterId": "C16",
      "chapter": "16 Hooks：事件触发的动作",
      "title": "钩子放在哪里",
      "kind": "concept",
      "narration": "钩子可以来自个人配置、项目配置或插件。常见文件是 hooks.json，也可以写在 config.toml 里。你不必背路径，但要问清这条规则影响一个项目，还是这台机器上的多个任务。多个来源可能一起生效，不是“新文件自动把旧文件全盖掉”。若同一检查莫名执行两次，要检查重复来源。修改前保留原文件，只改相关条目，随后核对加载结果，不要把整套个人配置一起替换。",
      "lines": [
        "个人配置",
        "项目配置",
        "插件也可能带钩子",
        "重复来源可能重复触发"
      ],
      "sourceIds": [
        "P01",
        "P15",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "file-stack",
        "expandItems": [
          "个人配置",
          "项目配置",
          "插件也可能带钩子",
          "重复来源可能重复触发"
        ],
        "highlights": [
          "重复来源可能重复触发"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S173",
      "chapterId": "C16",
      "chapter": "16 Hooks：事件触发的动作",
      "title": "它不是万能拦截器",
      "kind": "concept",
      "narration": "钩子能不能拦住动作，要看事件、工具路径和返回方式。尤其是连接 MCP 的钩子，需要已有连接；服务器缺失或报错，不等于操作一定被禁止。因此，“我装了一个检查钩子”不能代替确认权限和实际测试。后台钩子主要在旁边处理信息，也不能按同步钩子的方式控制原操作。对新手，最有价值的检查是：触发了吗，结果是什么，失败时到底继续还是停止。",
      "lines": [
        "触发是否成功",
        "返回是否被正确处理",
        "失败不一定意味着阻止"
      ],
      "sourceIds": [
        "P01",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "boundary-map",
        "expandItems": [
          "触发是否成功",
          "返回是否被正确处理",
          "失败不一定意味着阻止"
        ],
        "highlights": [
          "失败不一定意味着阻止"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S174",
      "chapterId": "C16",
      "chapter": "16 Hooks：事件触发的动作",
      "title": "Skill、MCP、Hook、计划任务",
      "kind": "concept",
      "narration": "现在把四个概念放在一起。Skill 像做事说明书；MCP 像连接工具的接口；Hook 像流程中某个时刻响起的铃；计划任务则回答何时再次开始一项工作。比如“按规范检查文字”可以是一套 Skill，而“每次改完后检查”关注触发时机。它们能够配合，却不是同一个开关。选择功能时先把需求拆成：方法是什么、工具在哪、何时触发，就不容易装一堆用不上的扩展。",
      "lines": [
        "Skill：方法",
        "MCP：工具连接",
        "Hook：流程事件",
        "计划任务：安排工作"
      ],
      "sourceIds": [
        "P01",
        "D13",
        "D16",
        "D17",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "Skill：方法",
          "MCP：工具连接",
          "Hook：流程事件",
          "计划任务：安排工作"
        ],
        "highlights": [
          "计划任务：安排工作"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S175",
      "chapterId": "C16",
      "chapter": "16 Hooks：事件触发的动作",
      "title": "钩子没反应时如何排查",
      "kind": "recap",
      "narration": "遇到钩子没有反应，先不要增加权限。依次检查：当前任务是否加载了这份来源；具体定义是否已信任；事件和匹配条件是否真的出现；命令或 MCP 工具是否存在；最后看超时和错误信息。把这几项交给 Codex 逐个说明，比只说“坏了，帮我修”更容易定位。组织管理的规则可能不能由个人关闭。日常任务不需要钩子时，可以保持默认使用，等有明确重复需求再配置。",
      "lines": [
        "来源与信任",
        "事件与匹配",
        "工具与超时",
        "逐项检查运行证据"
      ],
      "sourceIds": [
        "P01",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "flow-steps",
        "expandItems": [
          "来源与信任",
          "事件与匹配",
          "工具与超时",
          "逐项检查运行证据"
        ],
        "highlights": [
          "逐项检查运行证据"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S176",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "自动化让工作以后再发生",
      "kind": "concept",
      "narration": "自动化或计划任务，解决的是以后按时间或支持的条件启动工作。它和现在发一条请求不同，因为触发时你可能不正在看着聊天。所以要把任务、材料和结束条件写清楚。这里先认识设置和管理方式，不实际创建任何计划。等你真的需要重复或延后执行时，再用合适的小范围任务开始检查。",
      "lines": [
        "以后启动",
        "明确任务与材料",
        "设置结束条件"
      ],
      "sourceIds": [
        "D17",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "以后启动",
          "明确任务与材料",
          "设置结束条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S177",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "继续目标与定时任务不同",
      "kind": "concept",
      "narration": "如果希望当前任务围绕一个目标持续推进，可以看支持的目标模式；如果希望明天或每周重新开始某项工作，才更接近计划任务。一个强调持续完成同一目标，一个强调何时触发。两者都不会自动扩大权限。先说清你要的是继续做完，还是以后再启动，避免把长时间工作和重复安排混在一起。",
      "lines": [
        "当前目标持续推进",
        "未来按时启动",
        "权限仍然适用"
      ],
      "sourceIds": [
        "D17",
        "D28"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "当前目标持续推进",
          "未来按时启动",
          "权限仍然适用"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S178",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "把时间和内容说明确",
      "kind": "prompt",
      "narration": "描述计划时，至少说清做什么、何时做、依据什么材料。比如明天上午提醒我阅读这份说明，只是一个帮助理解结构的例句。正式创建时还要确认日期、时区和重复频率，避免今天和明天在不同环境里理解不一致。需要持续多久、何时停止，也可以提前写明，让计划有清楚的边界。",
      "lines": [
        "任务内容",
        "时间与频率",
        "材料与停止条件"
      ],
      "sourceIds": [
        "D17",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "任务内容",
          "时间与频率",
          "材料与停止条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S179",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "同聊天跟进还是独立运行",
      "kind": "concept",
      "narration": "有的计划是围绕当前聊天继续跟进，有的每次会启动相对独立的工作。前者适合依赖当前背景，后者适合重复执行清楚定义的任务。选择时先想：下次运行需要依赖哪段上下文？不要只把相同提示词反复发送，却忘记材料和条件可能已经变化。定期查看计划内容，可以避免旧要求一直被自动重复。",
      "lines": [
        "继续当前背景",
        "每次独立执行",
        "定期检查旧要求"
      ],
      "sourceIds": [
        "D17"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "继续当前背景",
          "每次独立执行",
          "定期检查旧要求"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S180",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "保存前核对计划信息",
      "kind": "ui",
      "narration": "创建计划有两条常见入口：在聊天里把时间和任务说清楚，查看生成的创建计划任务提议；或者选择添加计划任务。打开编辑信息后，逐项核对标题、提示词和频率，再保存。若按钮写保存并立即运行，它会同时启动一次工作，要确认这也是你的意图。保存后回到计划管理，找到这条计划并核对时间，安排才有可检查的落点。",
      "lines": [
        "添加计划任务或查看创建提议",
        "核对标题、提示词、频率",
        "保存与立即运行分开理解"
      ],
      "sourceIds": [
        "D17",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "选择添加计划任务或创建提议",
          "核对标题、提示词和频率",
          "确认是否需要立即运行",
          "保存后返回列表核对"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "sidebarElectron.addAutomation",
        "steps": [
          "选择添加计划任务或创建提议",
          "核对标题、提示词和频率",
          "确认是否需要立即运行",
          "保存后返回列表核对"
        ]
      },
      "uiRefs": [
        "sidebarElectron.addAutomation",
        "automations.editor.title",
        "automations.editor.promptSectionLabel",
        "automations.editor.schedule.frequencySectionLabel",
        "automations.editor.saveAndRunNow",
        "automation.sidePanel.createSuggestion"
      ],
      "steps": [
        "选择添加计划任务或创建提议",
        "核对标题、提示词和频率",
        "确认是否需要立即运行",
        "保存后返回列表核对"
      ]
    },
    {
      "id": "S181",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "本地任务需要电脑可用",
      "kind": "concept",
      "narration": "如果计划依赖本地运行，电脑、应用和所需目录必须在相应时间可用。不能因为它叫自动化，就认为关机以后仍会在这台电脑上执行。云端任务有自己的运行条件，也不能拿来替代所有本地规则。设置计划时，先明确它在哪运行；运行失败时，也先检查那套环境当时是否具备所需条件。",
      "lines": [
        "运行位置",
        "电脑与应用状态",
        "材料是否可访问"
      ],
      "sourceIds": [
        "D17",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "运行位置",
          "电脑与应用状态",
          "材料是否可访问"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S182",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "看运行记录而不只看计划",
      "kind": "workflow",
      "narration": "计划已经保存，只能证明安排存在，不能证明每次运行都成功。到管理入口查看运行记录，确认是否启动、是否等待输入、是否出现错误，以及结果在哪里。如果有通知，也把它当作提醒，再回到实际结果核对。第一次使用新计划时，多检查前几次运行，能及早发现时间、材料或输出要求的问题。",
      "lines": [
        "是否真正启动",
        "是否完成或受阻",
        "结果在哪里"
      ],
      "sourceIds": [
        "D17"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "是否真正启动",
          "是否完成或受阻",
          "结果在哪里"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S183",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "暂停、修改与结束安排",
      "kind": "concept",
      "narration": "当任务不再需要重复，或者材料和时间已经变化，要及时暂停或修改对应计划。永久不需要时，再使用当前支持的结束或删除方式。管理的是哪一个计划、会不会影响关联聊天，都应看清楚。尤其不要通过随意归档聊天来猜测计划状态；归档可能影响后续运行，操作后仍要回到计划管理确认结果。",
      "lines": [
        "暂时暂停",
        "调整条件",
        "结束不再需要的计划"
      ],
      "sourceIds": [
        "D17",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "暂时暂停",
          "调整条件",
          "结束不再需要的计划"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S184",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "自动化不会跳过权限",
      "kind": "concept",
      "narration": "计划到了时间，也不代表它获得了所有执行许可。文件范围、服务连接和动作审批仍然适用。某次运行可能因为需要批准、连接失效或环境缺少材料而停下。遇到这类情况，先看具体原因，再处理必要条件，不要为了避免下一次失败就无差别扩大权限。安排自动发生，和动作已经被允许，是不同的问题。",
      "lines": [
        "原有边界仍在",
        "失败可能有等待项",
        "按原因处理"
      ],
      "sourceIds": [
        "D17",
        "D19"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "原有边界仍在",
          "失败可能有等待项",
          "按原因处理"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S185",
      "chapterId": "C17",
      "chapter": "17 计划任务与自动化",
      "title": "什么时候适合自动化",
      "kind": "recap",
      "narration": "做个小判断：电脑关机以后，本地计划任务还能照常执行吗？不能，本地需要相应的电脑和应用可用。适合自动化的事情，通常目标稳定、材料来源明确、结果容易检查，而且确实需要重复或稍后执行。如果你自己还没弄清楚要什么，先在普通聊天里把要求验证清楚，会更容易设置一个可靠计划。自动化的价值是省去重复启动，不是把不确定的问题自动变正确。先理解，再安排，再看真实运行。",
      "lines": [
        "目标稳定",
        "材料明确",
        "结果能检查"
      ],
      "sourceIds": [
        "D17",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "quiz",
        "expandItems": [
          "目标稳定",
          "材料明确",
          "结果能检查"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      },
      "quiz": {
        "question": "电脑关机以后，本地计划任务还能照常执行吗？",
        "options": [
          "能，自动化不依赖电脑",
          "不能，本地运行需要相应环境可用"
        ],
        "answerIndex": 1,
        "explanation": "本地计划任务依赖电脑、应用和所需材料可用；云端条件另行判断。",
        "pauseAfterText": "做个小判断：电脑关机以后，本地计划任务还能照常执行吗？",
        "pauseSeconds": 5
      }
    },
    {
      "id": "S186",
      "chapterId": "C18",
      "chapter": "18 Dots：持续工作的代理",
      "title": "Dots 是什么",
      "kind": "concept",
      "narration": "你可能在侧边栏看到“你的 Dot”。这里的 Dot 指持续工作的云端代理，不是右上角三个点的更多菜单。可以把它理解为长期跟进工作的联系人：你交代目标，它继续安排工作，再把结果和需要决定的问题带回来。这一功能按账号逐步开放，没看到入口不代表你操作错了。它与当前这个 Codex 聊天也不是同一个概念，具体文件任务仍要看任务在哪里执行。",
      "lines": [
        "你的 Dot：持续工作的代理",
        "三点菜单：更多操作",
        "功能可能分批开放"
      ],
      "sourceIds": [
        "P02",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "你的 Dot：持续工作的代理",
          "三点菜单：更多操作",
          "功能可能分批开放"
        ],
        "highlights": [
          "功能可能分批开放"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "sidebarElectron.orbitNavigation.dot"
      ]
    },
    {
      "id": "S187",
      "chapterId": "C18",
      "chapter": "18 Dots：持续工作的代理",
      "title": "如何开始使用 Dot",
      "kind": "concept",
      "narration": "如果账号已有入口，打开 Dot 后按介绍设置名称和外观。初次连接应用可以按需要进行，不必为了完成设置把所有服务都接上。然后用普通话说明长期职责：要跟进什么、使用哪些资料、什么变化值得通知你。比如“关注资料更新，有实质变化再告诉我”，比“你自己看着办”更容易检查。名字和形象是辨认入口的方式，真正影响工作的仍然是任务说明、可用工具和权限。",
      "lines": [
        "打开入口并完成介绍",
        "设置名称与外观",
        "只连接当前需要的服务",
        "说清职责与通知条件"
      ],
      "sourceIds": [
        "P03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "flow-steps",
        "expandItems": [
          "打开入口并完成介绍",
          "设置名称与外观",
          "只连接当前需要的服务",
          "说清职责与通知条件"
        ],
        "highlights": [
          "说清职责与通知条件"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S188",
      "chapterId": "C18",
      "chapter": "18 Dots：持续工作的代理",
      "title": "三种连接不能混为一谈",
      "kind": "concept",
      "narration": "Dot 的连接要分成三条线。消息渠道让你和它说话；应用插件让它在授权范围内使用服务；连接个人电脑才涉及这台电脑的文件和工具。把它加进消息应用，不等于邮箱和电脑也自动开放。画面中的三条线应当分别检查：我在哪里发消息，它用哪个服务账号，动作在哪台机器发生。换手机继续聊天，也不意味着本地文件已经复制到了手机或云端。",
      "lines": [
        "消息渠道：联系",
        "应用插件：服务与数据",
        "个人电脑：本地文件与工具"
      ],
      "sourceIds": [
        "P05",
        "P03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "boundary-map",
        "expandItems": [
          "消息渠道：联系",
          "应用插件：服务与数据",
          "个人电脑：本地文件与工具"
        ],
        "highlights": [
          "个人电脑：本地文件与工具"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S189",
      "chapterId": "C18",
      "chapter": "18 Dots：持续工作的代理",
      "title": "云端电脑和你的 Mac",
      "kind": "concept",
      "narration": "Dot 有自己的云端电脑和浏览器，它们与 Mac 上的文件、登录状态分开。云端工作可以在你的设备关闭时继续；但要使用已连接的 Mac，这台 Mac 必须在线，桌面应用也要开着。进入云端计算机视图只是查看，真正操作要选择“获取控制权”，完成后“归还控制权”。断网不等于撤销授权；若要移除本机访问，应使用撤销访问的控制。先分清这几种状态，才能判断任务为什么在等待。",
      "lines": [
        "云端环境与本机分开",
        "本地动作需要电脑在线",
        "获取控制权 → 归还控制权"
      ],
      "sourceIds": [
        "P05",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "before-after",
        "expandItems": [
          "云端环境与本机分开",
          "本地动作需要电脑在线",
          "获取控制权 → 归还控制权"
        ],
        "highlights": [
          "获取控制权 → 归还控制权"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "restricted.aeon.computer.takeOver",
        "restricted.aeon.computer.returnControl",
        "restricted.aeon.computer.handoffOpen"
      ]
    },
    {
      "id": "S190",
      "chapterId": "C18",
      "chapter": "18 Dots：持续工作的代理",
      "title": "到哪里看它正在做什么",
      "kind": "ui",
      "narration": "想检查 Dot 的工作，打开它的资料面板，再看活动列表，选中具体任务。不要只看一句“我正在处理”，还要看有没有文件、结果、等待输入或失败信息。它可以分派后台任务，也能创建可见聊天。已有任务仍保留原来的执行环境；改变 Dot 当前选中的电脑，不会自动搬走以前的任务。直接进入任务补充要求，比让它凭一个模糊称呼猜是哪件事更可靠。",
      "lines": [
        "资料 → 活动 → 任务",
        "看结果、文件和等待状态",
        "既有任务保留执行环境"
      ],
      "sourceIds": [
        "P04",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "ui-focus",
        "expandItems": [
          "资料 → 活动 → 任务",
          "看结果、文件和等待状态",
          "既有任务保留执行环境"
        ],
        "highlights": [
          "既有任务保留执行环境"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "restricted.aeonMessaging.toggleProfile",
        "restricted.aeonMessaging.activityHeading",
        "orbit.taskThread.title"
      ]
    },
    {
      "id": "S191",
      "chapterId": "C18",
      "chapter": "18 Dots：持续工作的代理",
      "title": "长期职责、计划与记忆",
      "kind": "concept",
      "narration": "长期跟进不等于必须每隔五分钟跑一次。Dot 可以根据工作安排继续或等待，也能使用计划任务。交代职责时，补上完成条件、优先级和需要你决定的节点。它会利用相关记忆与笔记延续上下文，但你仍应及时更正过期信息。例如日期变了，就明确告诉它旧日期作废。记忆是帮助衔接的线索，不是每个细节永远正确的保证；真正验收仍要打开产物核对。",
      "lines": [
        "持续职责",
        "必要时安排时间",
        "及时纠正过期信息",
        "打开产物再验收"
      ],
      "sourceIds": [
        "P04",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "timeline",
        "expandItems": [
          "持续职责",
          "必要时安排时间",
          "及时纠正过期信息",
          "打开产物再验收"
        ],
        "highlights": [
          "打开产物再验收"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S192",
      "chapterId": "C18",
      "chapter": "18 Dots：持续工作的代理",
      "title": "指令、规则和服务权限",
      "kind": "concept",
      "narration": "与 Dot 对话时，先把允许它做的事情说具体。让它拟草稿，并没有要求它立即发送。需要长期边界时，可以在账号提供的自定义规则中选择如何处理某类动作，例如先问你，或交给你完成。规则不会凭空登录一个服务，也不会取消该服务自己的权限要求。判断授权时分两步：你有没有明确交代这件事，它有没有执行所需的实际访问权。不要把“有权限”理解成“任何场景都应当执行”。",
      "lines": [
        "说清动作范围",
        "规则控制何时征求决定",
        "服务访问权仍需单独具备"
      ],
      "sourceIds": [
        "P06",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "说清动作范围",
          "规则控制何时征求决定",
          "服务访问权仍需单独具备"
        ],
        "highlights": [
          "服务访问权仍需单独具备"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S193",
      "chapterId": "C18",
      "chapter": "18 Dots：持续工作的代理",
      "title": "暂停、停止和删除有何区别",
      "kind": "recap",
      "narration": "最后看几个容易混淆的控制。暂停 Dot 停的是它当前的主任务，不会自动停止所有已分派任务，也不会取消未来计划。要结束某项委派工作，进活动列表找到它；要结束定期运行，去计划任务里停用或删除。恢复可以继续暂停的 Dot；删除 Dot 不可撤销，需要先读确认说明并保存所需产物。无论哪一种停止，都不会自动撤回已发出的信息，或者恢复已经改动的外部文件。",
      "lines": [
        "暂停主任务",
        "委派任务分别停止",
        "定期计划单独取消",
        "停止不会撤回既有动作"
      ],
      "sourceIds": [
        "P06",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "flow-steps",
        "expandItems": [
          "暂停主任务",
          "委派任务分别停止",
          "定期计划单独取消",
          "停止不会撤回既有动作"
        ],
        "highlights": [
          "停止不会撤回既有动作"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S194",
      "chapterId": "C19",
      "chapter": "19 浏览器与电脑操控",
      "title": "搜索、浏览器、电脑操控",
      "kind": "concept",
      "narration": "“上网查资料”“打开网页”和“控制电脑”是三种不同的工作。搜索帮助找公开资料；浏览器能看到网页实际呈现的页面和状态；电脑操控则能在支持的图形界面里点击、输入、切换。需要从服务中读取数据时，也可能直接调用插件，而不出现鼠标移动。没有看到浏览器窗口，并不能证明它没有联网。你可以要求它说明使用了哪种工具、访问了哪个来源，以及怎样核验结果。",
      "lines": [
        "搜索：找资料",
        "浏览器：看页面与状态",
        "电脑操控：操作图形界面"
      ],
      "sourceIds": [
        "P07",
        "P09",
        "D19",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "搜索：找资料",
          "浏览器：看页面与状态",
          "电脑操控：操作图形界面"
        ],
        "highlights": [
          "电脑操控：操作图形界面"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S195",
      "chapterId": "C19",
      "chapter": "19 浏览器与电脑操控",
      "title": "内置浏览器：预览就在旁边",
      "kind": "ui",
      "narration": "桌面应用的内置浏览器可以把网页与聊天放在一起。支持时，选择新标签页并输入网址，或打开聊天中的链接；全屏和分屏用于调整阅读空间。它有独立的浏览器环境，不会天然继承你平常浏览器的所有登录和标签页。讲操作时可以用浏览器引用来明确目标。还要记得，本地地址打开成功只证明你看到了这个页面，不能据此说网站已经发布，或别人的手机也一定能访问。",
      "lines": [
        "新标签页 → 输入网址",
        "分屏查看聊天和网页",
        "独立浏览器环境",
        "预览成功不等于发布成功"
      ],
      "sourceIds": [
        "P07",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "ui-focus",
        "expandItems": [
          "新标签页 → 输入网址",
          "分屏查看聊天和网页",
          "独立浏览器环境",
          "预览成功不等于发布成功"
        ],
        "highlights": [
          "预览成功不等于发布成功"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S196",
      "chapterId": "C19",
      "chapter": "19 浏览器与电脑操控",
      "title": "使用 Chrome 扩展",
      "kind": "concept",
      "narration": "要使用现有 Chrome 中的页面，需要按当前说明连接浏览器扩展。在设置的电脑操控里找到浏览器，按提示安装插件和扩展，回到应用确认出现管理入口。发请求时，从引用菜单选 Chrome 或具体标签页。扩展安装在哪个 Chrome 用户配置里，连接也要用对应配置。新手最好准备专门的工作浏览器环境，避免把不相关页面一起带进任务；不要把另一个账号已登录误当成当前账号也已登录。",
      "lines": [
        "设置 → 电脑操控",
        "安装并检查管理入口",
        "引用 Chrome 或具体标签页",
        "核对浏览器用户配置"
      ],
      "sourceIds": [
        "P08",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "flow-steps",
        "expandItems": [
          "设置 → 电脑操控",
          "安装并检查管理入口",
          "引用 Chrome 或具体标签页",
          "核对浏览器用户配置"
        ],
        "highlights": [
          "核对浏览器用户配置"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S197",
      "chapterId": "C19",
      "chapter": "19 浏览器与电脑操控",
      "title": "电脑操控怎样开通",
      "kind": "concept",
      "narration": "电脑操控需要相应插件和访问设置。按当前桌面说明进入插件中的 Computer Use，安装或启用，再检查它的服务与 Skill 是否开启。Mac 还可能提示录屏和辅助功能权限：前者支持读取画面，后者支持点击和输入。系统权限通常在隐私与安全性里管理。看不到这些提示时，不要胡乱给所有应用放权，先检查版本、插件状态和账号可用性。能读取文件并不意味着已经获准操作每一个软件界面。",
      "lines": [
        "插件和服务先可用",
        "录屏：读取画面",
        "辅助功能：点击和输入",
        "应用访问仍有独立限制"
      ],
      "sourceIds": [
        "P09",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "permission-keys",
        "expandItems": [
          "插件和服务先可用",
          "录屏：读取画面",
          "辅助功能：点击和输入",
          "应用访问仍有独立限制"
        ],
        "highlights": [
          "应用访问仍有独立限制"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S198",
      "chapterId": "C19",
      "chapter": "19 浏览器与电脑操控",
      "title": "网站许可和上传下载",
      "kind": "concept",
      "narration": "浏览器许可要分清网站、动作和实际能力。允许访问网站，不代表同意上传任意资料或发送消息。内置浏览器的设置分别管理浏览、下载和上传权限，但当前官方说明仍不支持自动上传文件，不能把有设置当成能执行。Chrome 扩展的网站许可又有自己的管理入口。先核对域名、动作和授权时限。网页里让代理忽略原要求的文字，只是网页内容，不是你的新指令。",
      "lines": [
        "网站许可不是任意动作授权",
        "权限设置不代表能力已支持",
        "内置浏览器不能自动上传文件",
        "网页内容不是用户新指令"
      ],
      "sourceIds": [
        "P07",
        "P08",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "boundary-map",
        "expandItems": [
          "网站许可不是任意动作授权",
          "权限设置不代表能力已支持",
          "内置浏览器不能自动上传文件",
          "网页内容不是用户新指令"
        ],
        "highlights": [
          "内置浏览器不能自动上传文件"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S199",
      "chapterId": "C19",
      "chapter": "19 浏览器与电脑操控",
      "title": "网页批注怎样用",
      "kind": "concept",
      "narration": "有些问题很难只靠一句“这里不好看”讲清。内置浏览器支持时，可以进入批注模式，点选具体元素，或拖选区域，写清问题并保存，再让 Codex 根据批注处理。例如指出“这段字在窄窗口被遮住”，同时说明希望完整可读。批注定位的是页面区域，不是自动证明问题已经修好。处理完成后重新打开相同页面、相同窗口条件，再看结果；必要时对照变更记录，确认修改范围。",
      "lines": [
        "进入批注模式",
        "点元素或选区域",
        "写问题与期望结果",
        "修改后在相同条件复查"
      ],
      "sourceIds": [
        "P07",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "flow-steps",
        "expandItems": [
          "进入批注模式",
          "点元素或选区域",
          "写问题与期望结果",
          "修改后在相同条件复查"
        ],
        "highlights": [
          "修改后在相同条件复查"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S200",
      "chapterId": "C19",
      "chapter": "19 浏览器与电脑操控",
      "title": "开发者模式需要理解什么",
      "kind": "ui",
      "narration": "浏览器开发者模式用于进一步检查页面结构、控制台、网络请求和性能。当前官方路径是设置、浏览器、开发者模式，再选择启用完整 CDP 访问。CDP 是浏览器的调试接口，不需要你先学会代码。它支持已连接的 Chrome 和内置浏览器，使用前还会请求具体网站的明确批准。组织禁用的选项不能由个人打开。开关只是允许检查，结果仍要实际运行后读取。",
      "lines": [
        "设置 → 浏览器 → 开发者模式",
        "CDP：浏览器调试接口",
        "使用前批准具体网站访问",
        "开启不等于已完成检查"
      ],
      "sourceIds": [
        "P07",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "设置 → 浏览器 → 开发者模式",
          "CDP：浏览器调试接口",
          "使用前批准具体网站访问",
          "开启不等于已完成检查"
        ],
        "highlights": [
          "开启不等于已完成检查"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S201",
      "chapterId": "C19",
      "chapter": "19 浏览器与电脑操控",
      "title": "连接失败与人工接管",
      "kind": "recap",
      "narration": "操作网页失败时，按顺序看：浏览器是否正确、扩展是否装在当前配置、网站是否被阻止、账号登录是否过期、应用连接是否仍正常。登录、验证码或只能本人完成的步骤，使用产品提供的接管或私密登录流程，不把密码粘到聊天里。接管后完成必要一步，再明确交还控制。任务结束时检查页面中的实际状态和保存位置，关闭本次工作的临时窗口；不要把一句“点击完成”当作提交已成功的唯一证据。",
      "lines": [
        "浏览器与扩展",
        "网站许可与登录",
        "必要时人工接管",
        "核对结果并结束临时会话"
      ],
      "sourceIds": [
        "P08",
        "P05",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "flow-steps",
        "expandItems": [
          "浏览器与扩展",
          "网站许可与登录",
          "必要时人工接管",
          "核对结果并结束临时会话"
        ],
        "highlights": [
          "核对结果并结束临时会话"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S202",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "设置页面：先找类别",
      "kind": "ui",
      "narration": "Mac 上通常可以从应用菜单打开设置，默认快捷键是 Command 加逗号。设置不是必须从头调一遍的考试。常规管理日常行为，外观管理看起来怎样，通知管理什么时候提醒，配置与集成功能涉及工作方式。先说出你要改变的现象，再找对应类别。遇到灰色项或缺少选项，要考虑版本、账号、工作区政策和当前机器；不要因为视频里出现过，就断定你必须在同一位置找到。",
      "lines": [
        "应用菜单 → 设置",
        "Command + 逗号",
        "按要解决的问题找类别"
      ],
      "sourceIds": [
        "P10",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "应用菜单 → 设置",
          "Command + 逗号",
          "按要解决的问题找类别"
        ],
        "highlights": [
          "按要解决的问题找类别"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "settings.nav.general-settings",
        "settings.nav.appearance",
        "settings.nav.notifications",
        "settings.nav.agent"
      ]
    },
    {
      "id": "S203",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "常规：发送、跟进与睡眠",
      "kind": "ui",
      "narration": "在常规里，先检查 Enter 键的发送习惯。写长问题的人，可以选择适合多行输入的发送方式，减少半句话就发出去的情况。运行中发送的补充消息，是引导当前工作还是排队等下一轮，也有相应偏好。允许本地任务继续运行时，可以查看防止运行期间睡眠的选项，但它不等于合上电脑、断网或关机之后仍能执行。改完先用一条简短消息确认实际行为，不必同时调整所有开关。",
      "lines": [
        "Enter 与多行输入",
        "运行中消息：引导或排队",
        "防止睡眠不等于关机运行"
      ],
      "sourceIds": [
        "P10",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "ui-focus",
        "expandItems": [
          "Enter 与多行输入",
          "运行中消息：引导或排队",
          "防止睡眠不等于关机运行"
        ],
        "highlights": [
          "防止睡眠不等于关机运行"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S204",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "外观：看得清比装饰重要",
      "kind": "concept",
      "narration": "外观设置会影响主题、界面字和代码字的阅读体验。日常看聊天，把界面字体调到舒服的大小；读变更或终端，再检查代码字体。浅色、深色或跟随系统是个人选择，不能说明模型变强或变弱。若调色后按钮和文字看不清，先恢复一个易读主题，再逐项调整。录屏教学时也要记得，自己在大屏幕能看清，不代表观众在手机上能看清；重要按钮需要放大讲解。",
      "lines": [
        "主题与颜色",
        "界面字号",
        "代码字号",
        "先保证清晰可读"
      ],
      "sourceIds": [
        "P10",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "before-after",
        "expandItems": [
          "主题与颜色",
          "界面字号",
          "代码字号",
          "先保证清晰可读"
        ],
        "highlights": [
          "先保证清晰可读"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S205",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "快捷键和通知",
      "kind": "ui",
      "narration": "快捷键设置可以按命令名称查，也能检查一组按键被分给了哪个动作。先记最常用的几个，其他随用随查，尤其要考虑自己改过按键或其他软件抢占快捷键的情况。通知设置则控制任务完成时如何提醒；Mac 系统本身也有通知权限。没有弹出提醒，不一定是任务没完成，可以回到聊天查看状态。通知告诉你有新进展，真正需要确认的结果仍然在任务里。",
      "lines": [
        "按名称查快捷键",
        "检查按键冲突",
        "应用与系统通知各自检查",
        "提醒后回到任务验收"
      ],
      "sourceIds": [
        "P10",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "ui-focus",
        "expandItems": [
          "按名称查快捷键",
          "检查按键冲突",
          "应用与系统通知各自检查",
          "提醒后回到任务验收"
        ],
        "highlights": [
          "提醒后回到任务验收"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "settings.nav.keyboard-shortcuts",
        "settings.nav.notifications"
      ]
    },
    {
      "id": "S206",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "AGENTS.md：可复用的工作约定",
      "kind": "concept",
      "narration": "如果有长期要求，不想每次重说，可以把它整理进 AGENTS.md。这是一份给代理看的文字约定，例如使用中文解释、修改前先读哪些说明、完成后怎样检查。个人级要求与项目级要求作用范围不同，目录更近的项目说明还可能补充或覆盖较广的要求。写的时候要具体、简短、可验证，别把临时任务和过期信息永久塞进去。改后可以请 Codex 列出本次实际读取的说明来源，确认规则用在了正确项目。",
      "lines": [
        "文字约定可重复使用",
        "个人级与项目级分开",
        "写具体、可验证的要求",
        "核对实际读取的来源"
      ],
      "sourceIds": [
        "P11",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "file-stack",
        "expandItems": [
          "文字约定可重复使用",
          "个人级与项目级分开",
          "写具体、可验证的要求",
          "核对实际读取的来源"
        ],
        "highlights": [
          "核对实际读取的来源"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S207",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "记忆：使用和贡献是两件事",
      "kind": "concept",
      "narration": "本地 Codex 记忆帮助后续任务利用此前的相关背景，但与 ChatGPT 的云端记忆不应混为一谈。支持时，在个性化里启用本机记忆，也可以通过当前聊天的记忆控制区分：这次能否使用已有记忆，以及这次内容能否成为未来记忆。记忆整理可能延后发生，不是说一句话就立刻同步到所有设备。重要规则放明确说明中；发现过时内容要更正。在本机删除 Codex 记忆，还会清除可用的电脑历史功能所保存的记录，确认前要看清范围。",
      "lines": [
        "使用已有记忆",
        "贡献未来记忆",
        "本机与云端控制有区别",
        "重要规则仍要明确保存"
      ],
      "sourceIds": [
        "P12",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "使用已有记忆",
          "贡献未来记忆",
          "本机与云端控制有区别",
          "重要规则仍要明确保存"
        ],
        "highlights": [
          "重要规则仍要明确保存"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S208",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "Computer History：回看工作线索",
      "kind": "concept",
      "narration": "Computer History 是可选的电脑历史功能，不能直接理解成录屏。当前说明中，它把允许来源的交互事件和可读取文字整理成时间线，不保存历史截图或音频。需要你主动启用并选择应用、网站范围；相关事件会交给 OpenAI 处理以生成记忆，再保存在本机，所以也不是纯离线日志。可以暂停未来收集，或者删除已有条目，这两件事不同。涉及与他人沟通的内容，要先取得对方同意；不需要的来源可以排除。",
      "lines": [
        "选择允许记录的来源",
        "时间线帮助找回线索",
        "暂停收集与删除历史不同",
        "事件处理并非完全离线"
      ],
      "sourceIds": [
        "P13"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "timeline",
        "expandItems": [
          "选择允许记录的来源",
          "时间线帮助找回线索",
          "暂停收集与删除历史不同",
          "事件处理并非完全离线"
        ],
        "highlights": [
          "事件处理并非完全离线"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S209",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "Pets：悬浮入口与任务状态",
      "kind": "ui",
      "narration": "Pets 是桌面上的可选悬浮伙伴。支持时，在设置里选择宠物，或用 Mini 只保留简洁聊天控件；也可以显示、隐藏和调整大小。它下面的聊天、语音和活动入口，方便你在别的软件旁边继续工作。看到等待输入或完成状态，可以打开对应任务查看。它是交互入口，不会因为换一只形象就改变模型和权限。按当前说明，从悬浮控件新建的聊天不在项目里；要使用明确的项目上下文，回项目中开始。",
      "lines": [
        "宠物或 Mini 控件",
        "快捷聊天与活动入口",
        "状态仍需打开任务查看",
        "项目工作从项目入口开始"
      ],
      "sourceIds": [
        "P14",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "ui-focus",
        "expandItems": [
          "宠物或 Mini 控件",
          "快捷聊天与活动入口",
          "状态仍需打开任务查看",
          "项目工作从项目入口开始"
        ],
        "highlights": [
          "项目工作从项目入口开始"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      }
    },
    {
      "id": "S210",
      "chapterId": "C20",
      "chapter": "20 设置、偏好与配置边界",
      "title": "配置文件：改前说明，改后核对",
      "kind": "recap",
      "narration": "最后认识 config.toml。它存放部分默认配置，与记录自然语言约定的 AGENTS.md 分工不同。个人配置与受信任项目配置可能同时存在，组织要求还会约束可用值。新手不用从网上复制整份配置；应先告诉 Codex 想改变哪一个行为，让它指出对应项、作用范围和恢复办法。修改前保留旧内容，改后检查实际生效状态。若设置仍被覆盖，就查其他配置层和组织要求，不要不断加重复条目。",
      "lines": [
        "config.toml：配置值",
        "AGENTS.md：文字约定",
        "只改需要的相关项",
        "确认生效与恢复方法"
      ],
      "sourceIds": [
        "P15",
        "P11",
        "U01",
        "T01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "file-stack",
        "expandItems": [
          "config.toml：配置值",
          "AGENTS.md：文字约定",
          "只改需要的相关项",
          "确认生效与恢复方法"
        ],
        "highlights": [
          "确认生效与恢复方法"
        ],
        "note": "教学重绘；具体入口和可见选项以当前版本为准。"
      },
      "uiRefs": [
        "settings.nav.agent"
      ]
    },
    {
      "id": "S211",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "先把卡住分成几类",
      "kind": "workflow",
      "narration": "出现问题时，先不要同时改很多设置。可以把情况分成几类：还在正常处理，等待你提供信息，等待批准，工具或连接失败，或者工作方向已经偏离。不同原因对应不同处理。先看最近的状态和错误提示，找出停在哪一步，再做最小的必要调整。这样即使没有立刻解决，也能逐渐缩小原因。",
      "lines": [
        "正常处理",
        "等待条件",
        "失败或跑偏"
      ],
      "sourceIds": [
        "D20",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "正常处理",
          "等待条件",
          "失败或跑偏"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S212",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "看批准提示和连接状态",
      "kind": "concept",
      "narration": "任务迟迟不继续，先看看有没有未处理的批准请求、登录窗口或缺少材料的提示。有时提示不在你正在看的区域，需要返回相关聊天或连接管理。确认等待项以后再处理，不必重新发送整段请求。服务连接出问题时，也应先看当前账号、认证和可用状态，避免反复安装已经存在的插件。",
      "lines": [
        "是否等批准",
        "是否等登录",
        "是否缺材料"
      ],
      "sourceIds": [
        "D20",
        "D16"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "是否等批准",
          "是否等登录",
          "是否缺材料"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S213",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "找不到聊天按顺序找",
      "kind": "concept",
      "narration": "如果聊天不见了，先搜索你记得的标题或主题词，再检查所属项目和列表筛选，最后到已归档的聊天查看。不要因为侧栏当前没有显示，就直接认定记录被删除。不同入口可能展示不同类型的聊天，所以还要确认当前处于 Chat、Work 还是 Codex。按对象和范围查找，比从头重新做一遍更可靠。",
      "lines": [
        "搜索主题词",
        "看项目与筛选",
        "检查归档和入口"
      ],
      "sourceIds": [
        "D02",
        "D20",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "搜索主题词",
          "看项目与筛选",
          "检查归档和入口"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S214",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "找不到文件先回看交接",
      "kind": "concept",
      "narration": "找不到结果文件时，先回到任务的最后回复，寻找实际文件链接和保存路径。再确认当前工作位置，是本地、云端，还是另一台远程主机。预览没有显示，不必然代表文件不存在；聊天里有内容，也不必然代表已经保存。把位置和产物状态查清楚以后，再决定打开、下载，还是补做保存这一步。",
      "lines": [
        "结果链接",
        "保存路径",
        "当前执行位置"
      ],
      "sourceIds": [
        "D10",
        "D20",
        "D08"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "结果链接",
          "保存路径",
          "当前执行位置"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S215",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "跑偏先控制新增影响",
      "kind": "concept",
      "narration": "发现任务开始偏离目标，先停止当前运行，再检查已经产生的变化。把问题具体说出来，例如我只想了解原因，暂时不需要改文件。然后缩小范围，决定继续当前聊天还是另开一段。不要在不知道已有变化的情况下反复要求重做，否则可能把原问题叠加成多个版本，也更难判断最后应该保留什么。",
      "lines": [
        "先停止",
        "查已有变化",
        "重新说明范围"
      ],
      "sourceIds": [
        "D20",
        "D03",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "先停止",
          "查已有变化",
          "重新说明范围"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S216",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "命令失败先检查对象",
      "kind": "concept",
      "narration": "终端或命令失败时，除了错误文字，还要确认当前目录、文件路径和所需程序是否存在。命令本身看起来相同，换一个目录执行，结果可能完全不同。把错误信息和相关位置一起交给它分析，会比只说运行不了更有帮助。不要盲目重复带写入或删除效果的命令，先解释失败原因和下一步准备改变什么。",
      "lines": [
        "目录与路径",
        "程序与依赖",
        "具体错误信息"
      ],
      "sourceIds": [
        "D20",
        "D19"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "目录与路径",
          "程序与依赖",
          "具体错误信息"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S217",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "缺少按钮先查四个条件",
      "kind": "concept",
      "narration": "教程里有一个功能，你的界面却没有，先查四件事：是不是同一个产品入口，版本是否相近，账号是否支持，组织是否限制。命令行和桌面也可能包含不同版本，不能因为另一边能用，就断言当前界面坏了。把条件核对清楚以后，再按官方说明处理更新或设置，避免为了找一个按钮四处修改无关配置。",
      "lines": [
        "产品入口",
        "应用与工具版本",
        "账号和组织条件"
      ],
      "sourceIds": [
        "D20",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "产品入口",
          "应用与工具版本",
          "账号和组织条件"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S218",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "上下文乱了可以重新整理",
      "kind": "concept",
      "narration": "如果回答一直沿着旧方向走，可能是当前聊天积累了太多互相变化的要求。可以先整理一份简短交接：现在的目标是什么，已确认什么，哪些要求作废，接下来只做哪一步。然后继续，或者带着这份明确背景开新聊天。重新开始并不是失败，关键是保留影响当前任务的事实，而不是把所有历史重新堆进去。",
      "lines": [
        "当前目标",
        "已确认与已作废",
        "下一步范围"
      ],
      "sourceIds": [
        "D03",
        "D20",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "当前目标",
          "已确认与已作废",
          "下一步范围"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S219",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "反馈问题要给可重现信息",
      "kind": "concept",
      "narration": "需要向支持渠道反馈时，准备应用版本、操作系统、执行环境、发生步骤，以及预期和实际结果。截图可以帮助说明位置，日志可以帮助定位原因，但分享前先检查账号、路径、文件内容或凭据等敏感信息。只说不好用很难定位；说明点了什么、接着出现什么，会让问题更容易被理解和复现。",
      "lines": [
        "版本与环境",
        "步骤与实际结果",
        "分享前检查敏感信息"
      ],
      "sourceIds": [
        "D20"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "版本与环境",
          "步骤与实际结果",
          "分享前检查敏感信息"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S220",
      "chapterId": "C21",
      "chapter": "21 排错与恢复控制",
      "title": "恢复控制的顺序",
      "kind": "recap",
      "narration": "最后把排错顺序记成四步：先看状态，再查对象，补齐必要条件，最后检查结果。涉及跑偏，就先停止新增动作；涉及权限，就先读具体请求；涉及文件，就先确认路径；涉及连接，就先看账号和状态。我们追求的不是背下所有错误，而是让每次检查都能回答一个明确问题，逐步把情况变得可控。",
      "lines": [
        "看状态",
        "查对象与条件",
        "改后再检查"
      ],
      "sourceIds": [
        "D20",
        "T01"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "recap-map",
        "expandItems": [
          "看状态",
          "查对象与条件",
          "改后再检查"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S221",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "智能体目录与临时协作不同",
      "kind": "ui",
      "narration": "最后补几种容易混淆的入口。打开智能体目录后，可以在我创建的、最近使用和团队目录里查找，也可以直接搜索智能体。打开条目，先读用途和所需连接，再选择使用。这里提供的是可复用的工作区代理，创建与分享受相应权限管理。它不是某次任务临时叫来的子代理，也不是前面讲的 Dot；先分清来源，再判断要用哪个。",
      "lines": [
        "智能体目录：搜索与分类",
        "打开条目看用途和连接",
        "与临时子代理、Dot 区分"
      ],
      "sourceIds": [
        "D26",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "打开智能体目录",
          "搜索或选择分类",
          "打开条目看用途",
          "确认所需连接后使用"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "workspaceAgents.index.search.label",
        "steps": [
          "打开智能体目录",
          "搜索或选择分类",
          "打开条目看用途",
          "确认所需连接后使用"
        ]
      },
      "uiRefs": [
        "sidebarElectron.workspaceAgentsRouteNavLink",
        "workspaceAgents.index.view.mine",
        "workspaceAgents.index.view.recent",
        "workspaceAgents.index.view.teamDirectory",
        "workspaceAgents.index.search.label"
      ],
      "steps": [
        "打开智能体目录",
        "搜索或选择分类",
        "打开条目看用途",
        "确认所需连接后使用"
      ]
    },
    {
      "id": "S222",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "子代理负责独立的一部分",
      "kind": "concept",
      "narration": "子代理是把一项较大工作中能独立处理的部分分出去，最后由主聊天汇总。在支持的 Codex 里，可以明确要求分工，并说明各自范围和汇报方式，再查看进展与结果。并行不一定总是更好：它会增加用量，多个代理同时改同一文件也容易冲突。适合先拆清职责，再让彼此独立的工作同时进行。",
      "lines": [
        "拆分独立任务",
        "明确职责与汇总",
        "关注用量与冲突"
      ],
      "sourceIds": [
        "D27"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "拆分独立任务",
          "明确职责与汇总",
          "关注用量与冲突"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S223",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "实时语音与听写不同",
      "kind": "ui",
      "narration": "听写是把声音变成输入框里的文字，实时语音则是边说边交流，查看进度或调整任务。在支持的入口里，开始语音聊天后，首次可能需要麦克风授权和声音选择；结束时使用停止语音聊天。屏幕上下文另有权限与条件，不会因为开麦克风就自动全开。找不到入口，先查账号、工作区和版本，不要把听写按钮当成同一个功能。",
      "lines": [
        "听写：转文字",
        "语音：持续交流",
        "麦克风与屏幕权限分开"
      ],
      "sourceIds": [
        "D24",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "mode-compare",
        "expandItems": [
          "听写：转文字",
          "语音：持续交流",
          "麦克风与屏幕权限分开"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S224",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "Appshots 提供当前窗口材料",
      "kind": "ui",
      "narration": "Appshots 可以把当前最前方的应用窗口作为材料提供给聊天。官方 Mac 默认方式是同时按两侧 Command 键，也可以在设置里改快捷键和接收聊天。它可能包含窗口图像以及应用提供的文字，甚至不只可见的一小块，所以发送前先确认窗口和内容。完成系统权限后，再检查附件去了哪里；这不等于持续操控整个电脑。",
      "lines": [
        "最前方窗口",
        "图像与可访问文字",
        "核对接收聊天"
      ],
      "sourceIds": [
        "D22",
        "U01"
      ],
      "evidenceStatus": "official_and_static",
      "visual": {
        "template": "context-files",
        "expandItems": [
          "最前方窗口",
          "图像与可访问文字",
          "核对接收聊天"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。",
        "clickTarget": "composer.appshotCapture.attach"
      },
      "uiRefs": [
        "composer.appshotCapture.attach"
      ]
    },
    {
      "id": "S225",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "输入预测只是可编辑草稿",
      "kind": "ui",
      "narration": "有些支持条件下，Codex 回复后会在输入框给出下一条消息建议，这叫 Composer Predictions。按 Tab 接受以后，它成为可编辑草稿，并不会自动发送。你可以改写，也可以直接输入自己的话，不必接受建议。这个功能有账号、地区、模型和线程条件；如果没有显示，先看官方当前可用范围，不要照着示意图猜自己一定漏开了按钮。",
      "lines": [
        "下一条消息建议",
        "Tab 接受为草稿",
        "检查后再发送"
      ],
      "sourceIds": [
        "D21"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "menu-expand",
        "expandItems": [
          "下一条消息建议",
          "Tab 接受为草稿",
          "检查后再发送"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S226",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "分享的是只读快照",
      "kind": "ui",
      "narration": "在支持的 Mac 本地 Codex 聊天里，可以分享一份只读快照。先打开分享入口，确认接收范围，再按界面完成链接发布；官方当前流程中，复制链接是发布的关键步骤。分享前打开链接检查内容，尤其是图片、路径和文件差异。快照不会随着原聊天继续更新，也不给别人访问你的电脑。个人与工作区账号的访问规则不同，要分别确认。",
      "lines": [
        "确认接收范围",
        "发布前检查快照",
        "不授予电脑访问"
      ],
      "sourceIds": [
        "D25"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "确认接收范围",
          "发布前检查快照",
          "不授予电脑访问"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S227",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "录制与回放是学习工作方法",
      "kind": "concept",
      "narration": "Record & Replay 不是播放聊天历史录像，而是让你在 Mac 上演示一段操作，再把方法整理成可复用技能。它需要相应的电脑操控能力已经可用并启用，适合步骤稳定、成功标准清楚的重复工作。录到的不是永久正确答案，生成的技能仍然要检查：用了哪些材料，哪些输入会变化，以及完成后怎样验证。",
      "lines": [
        "演示工作方法",
        "整理为可复用技能",
        "不是聊天录像播放器"
      ],
      "sourceIds": [
        "D23"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "skill-recipe",
        "expandItems": [
          "演示工作方法",
          "整理为可复用技能",
          "不是聊天录像播放器"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S228",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "录制前后分别检查什么",
      "kind": "workflow",
      "narration": "官方流程从插件入口选择录制技能，先说明目标，准备好以后再批准录制，然后完成演示并主动停止。录制期间会观察相关动作和窗口内容，所以不要顺手切到无关材料。结束后阅读生成的技能，补充隐含规则。再次使用时提供这一次变化的输入，由当前工具执行，而不是保证按相同鼠标坐标机械重放。",
      "lines": [
        "说明目标再录制",
        "演示结束主动停止",
        "检查技能和变化输入"
      ],
      "sourceIds": [
        "D23"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "说明目标再录制",
          "演示结束主动停止",
          "检查技能和变化输入"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S229",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "目标模式用于持续推进",
      "kind": "ui",
      "narration": "如果一项工作需要很多步，可以在支持的桌面入口用目标模式，写明最终结果、限制和完成标准。目标进度区域可以暂停、继续、修改或清除目标；只是新增目标，不会扩大原有权限。它与每天定时启动的计划任务不同，重点是围绕同一个目标持续推进。开始前先想清楚怎样算完成，过程中再根据实际结果调整。",
      "lines": [
        "结果与限制",
        "可判断的完成标准",
        "暂停与继续"
      ],
      "sourceIds": [
        "D28"
      ],
      "evidenceStatus": "official_doc",
      "visual": {
        "template": "workflow",
        "expandItems": [
          "结果与限制",
          "可判断的完成标准",
          "暂停与继续"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S230",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "按问题选择功能",
      "kind": "recap",
      "narration": "现在可以把功能分成几组来找。说不清需求，就回到目标、材料和限制；找不到内容，就看项目、引用和搜索；不清楚发生了什么，就看状态、文件和差异；需要重复方法，就看技能；需要外部工具，就看连接。先定位自己遇到的是哪一类问题，再打开对应功能，比一口气尝试所有按钮更容易学会。",
      "lines": [
        "表达与材料",
        "过程与结果",
        "复用与连接"
      ],
      "sourceIds": [
        "T01"
      ],
      "evidenceStatus": "teaching_design",
      "visual": {
        "template": "recap-map",
        "expandItems": [
          "表达与材料",
          "过程与结果",
          "复用与连接"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S231",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "用三个问题复习控制边界",
      "kind": "recap",
      "narration": "最后再检查三个问题：现在处理的是哪份材料，动作准备发生在哪里，我要怎样验证结果？这三个答案清楚以后，再看模型、权限和工具选择，就有了依据。遇到异常，先停止扩大影响，再查看已发生的变化。你不需要立刻掌握所有配置，能辨认问题、找到入口、检查结果，就是扎实的基础。",
      "lines": [
        "哪份材料",
        "在哪里行动",
        "怎样验证"
      ],
      "sourceIds": [
        "T01"
      ],
      "evidenceStatus": "teaching_design",
      "visual": {
        "template": "recap-map",
        "expandItems": [
          "哪份材料",
          "在哪里行动",
          "怎样验证"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S232",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "把导览当作查找工具",
      "kind": "recap",
      "narration": "配套的功能导览可以按章节查找，也可以展开某个功能的含义和步骤。视频里的点击是教学动画，导览里的按钮才是实际可交互的内容，两者不要混淆。第一次看可以按顺序，之后遇到具体问题，直接回到对应章节。学习的目标不是记住两百多个画面，而是形成一张知道该去哪里找的地图。",
      "lines": [
        "第一次按顺序",
        "以后按问题查找",
        "视频与导览分开"
      ],
      "sourceIds": [
        "T01"
      ],
      "evidenceStatus": "teaching_design",
      "visual": {
        "template": "recap-map",
        "expandItems": [
          "第一次按顺序",
          "以后按问题查找",
          "视频与导览分开"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    },
    {
      "id": "S233",
      "chapterId": "C22",
      "chapter": "22 其他常用功能与复习导览",
      "title": "理解功能以后再慢慢熟悉",
      "kind": "recap",
      "narration": "这就是森虫虫系列课的 Codex 基础功能导览。软件会更新，入口和可用范围也会变化，所以我们把官方来源和核对日期一起放在配套资料中。你可以先熟悉最常用的几个入口，再逐步理解需要的扩展功能。本课程使用 AI 合成女声与教学重绘画面；实际操作时，始终以你当前的界面、权限和真实结果为准。",
      "lines": [
        "森虫虫系列课",
        "来源核对：2026-10-24",
        "配音：AI 合成"
      ],
      "sourceIds": [
        "T01"
      ],
      "evidenceStatus": "teaching_design",
      "visual": {
        "template": "collage-title",
        "expandItems": [
          "森虫虫系列课",
          "来源核对：2026-10-24",
          "配音：AI 合成"
        ],
        "note": "教学重绘；入口与可用功能以当前版本及账号为准。"
      }
    }
  ],
  "evidenceNote": "当前无原生运行时界面实录；官方文档与本机静态标签支持教学重绘。",
  "narrationSha256": "8c523b05c0066954fd0d82b14ec5c948e9b1c127913579858304ffbf55493795"
}
