From 3886432a437a0d64b8aac0b7e2eb762c69d1e2cd Mon Sep 17 00:00:00 2001 From: Mira Voss Date: Mon, 21 Sep 2026 22:29:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=A4=8D=E4=B9=A0=E5=87=BA=E5=8F=A3):=204?= =?UTF-8?q?0=20=E8=AF=BE=E7=AD=94=E9=A2=98=E7=BB=93=E6=9E=9C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8F=AF=E9=94=AE=E7=9B=98=E6=93=8D=E4=BD=9C=E7=9A=84?= =?UTF-8?q?=E5=A4=8D=E4=B9=A0=E5=87=BA=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 此前「复习出口」只是文档承诺:答错后只列出未达成的目标,学习者无法一键回到讲这条 目标的任务页。现在每课答题结果按未达成目标去重生成原生按钮,点击后回到对应任务面 板并把焦点交给该面板标题,同时用 aria-live 说明去向;未提交、全答对或步骤锁定时不 渲染或原地返回。 - 每课新增 objectiveReviewStep,把学习目标映射到讲它的任务面板 - 静态契约:退出入口无 tabindex、按钮为原生 button、有 focus-visible 样式 - s1-01 驱动与 flow 驱动量到真实点击后的面板、焦点与提示条 - 每课 flow 检查 19→20(39 课共 780 项),文档与验收矩阵同步 - 修正「已审校」措辞漂移:页面与文档统一写「已通过校验」 验证:bun test 794/794;e2e:flow 780/780;e2e:keyboard 328/328; e2e:typed 659/659;e2e:prereq 242/242;e2e:s1-01 88/88;bun run build 通过。 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- AGENTS.md | 2 +- README.md | 10 +- docs/feature-checklist.md | 88 ++++++------- docs/roadmap.md | 166 ++++++++++++------------- lessons/s1-01/index.html | 130 +++++++++++++++++-- lessons/s1-02/index.html | 130 +++++++++++++++++-- lessons/s1-03/index.html | 130 +++++++++++++++++-- lessons/s1-04/index.html | 130 +++++++++++++++++-- lessons/s1-05/index.html | 132 ++++++++++++++++++-- lessons/s1-06/index.html | 130 +++++++++++++++++-- lessons/s1-07/index.html | 130 +++++++++++++++++-- lessons/s1-08/index.html | 130 +++++++++++++++++-- lessons/s2-01/index.html | 130 +++++++++++++++++-- lessons/s2-02/index.html | 130 +++++++++++++++++-- lessons/s2-03/index.html | 130 +++++++++++++++++-- lessons/s2-04/index.html | 130 +++++++++++++++++-- lessons/s2-05/index.html | 130 +++++++++++++++++-- lessons/s2-06/index.html | 130 +++++++++++++++++-- lessons/s2-07/index.html | 130 +++++++++++++++++-- lessons/s2-08/index.html | 130 +++++++++++++++++-- lessons/s3-01/index.html | 130 +++++++++++++++++-- lessons/s3-02/index.html | 130 +++++++++++++++++-- lessons/s3-03/index.html | 130 +++++++++++++++++-- lessons/s3-04/index.html | 130 +++++++++++++++++-- lessons/s3-05/index.html | 130 +++++++++++++++++-- lessons/s3-06/index.html | 130 +++++++++++++++++-- lessons/s3-07/index.html | 130 +++++++++++++++++-- lessons/s3-08/index.html | 130 +++++++++++++++++-- lessons/s4-01/index.html | 130 +++++++++++++++++-- lessons/s4-02/index.html | 130 +++++++++++++++++-- lessons/s4-03/index.html | 130 +++++++++++++++++-- lessons/s4-04/index.html | 130 +++++++++++++++++-- lessons/s4-05/index.html | 130 +++++++++++++++++-- lessons/s4-06/index.html | 130 +++++++++++++++++-- lessons/s4-07/index.html | 130 +++++++++++++++++-- lessons/s4-08/index.html | 130 +++++++++++++++++-- lessons/s5-01/index.html | 130 +++++++++++++++++-- lessons/s5-02/index.html | 130 +++++++++++++++++-- lessons/s5-03/index.html | 130 +++++++++++++++++-- lessons/s5-04/index.html | 130 +++++++++++++++++-- lessons/s5-05/index.html | 130 +++++++++++++++++-- lessons/s5-06/index.html | 130 +++++++++++++++++-- lessons/s5-07/index.html | 130 +++++++++++++++++-- lessons/s5-08/index.html | 130 +++++++++++++++++-- tests/e2e/flow-cdp.ts | 68 +++++++++- tests/e2e/flow-manual-checklist.md | 27 ++-- tests/e2e/manual-checklist.md | 4 +- tests/e2e/s1-01-cdp.ts | 61 ++++++++- tests/e2e/s1-01-manual-checklist.md | 8 +- tests/e2e/s1-02-manual-checklist.md | 4 +- tests/e2e/s1-03-manual-checklist.md | 4 +- tests/e2e/s1-04-manual-checklist.md | 4 +- tests/e2e/s1-05-manual-checklist.md | 4 +- tests/e2e/s1-06-manual-checklist.md | 4 +- tests/e2e/s1-07-manual-checklist.md | 4 +- tests/e2e/s1-08-manual-checklist.md | 4 +- tests/e2e/s2-01-manual-checklist.md | 4 +- tests/e2e/s2-02-manual-checklist.md | 4 +- tests/e2e/s2-03-manual-checklist.md | 4 +- tests/e2e/s2-04-manual-checklist.md | 4 +- tests/e2e/s2-05-manual-checklist.md | 4 +- tests/e2e/s2-06-manual-checklist.md | 4 +- tests/e2e/s2-07-manual-checklist.md | 4 +- tests/e2e/s2-08-manual-checklist.md | 4 +- tests/e2e/s3-01-manual-checklist.md | 4 +- tests/e2e/s3-02-manual-checklist.md | 4 +- tests/e2e/s3-03-manual-checklist.md | 4 +- tests/e2e/s3-04-manual-checklist.md | 4 +- tests/e2e/s3-05-manual-checklist.md | 4 +- tests/e2e/s3-06-manual-checklist.md | 4 +- tests/e2e/s3-07-manual-checklist.md | 4 +- tests/e2e/s3-08-manual-checklist.md | 4 +- tests/e2e/s4-01-manual-checklist.md | 4 +- tests/e2e/s4-02-manual-checklist.md | 4 +- tests/e2e/s4-03-manual-checklist.md | 4 +- tests/e2e/s4-04-manual-checklist.md | 4 +- tests/e2e/s4-05-manual-checklist.md | 4 +- tests/e2e/s4-06-manual-checklist.md | 4 +- tests/e2e/s4-07-manual-checklist.md | 4 +- tests/e2e/s4-08-manual-checklist.md | 4 +- tests/e2e/s5-01-manual-checklist.md | 4 +- tests/e2e/s5-02-manual-checklist.md | 4 +- tests/e2e/s5-03-manual-checklist.md | 4 +- tests/e2e/s5-04-manual-checklist.md | 4 +- tests/e2e/s5-05-manual-checklist.md | 4 +- tests/e2e/s5-06-manual-checklist.md | 4 +- tests/e2e/s5-07-manual-checklist.md | 4 +- tests/e2e/s5-08-manual-checklist.md | 4 +- tests/keyboard-access-contract.test.ts | 38 ++++++ tests/objective-binding.test.ts | 138 ++++++++++++++++++++ 90 files changed, 5295 insertions(+), 673 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 9de404b..614eadd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -50,7 +50,7 @@ - 一节课程从“规划”变为“可在线学习”前,必须同时具备本课专属的互动学习界面和在线测试入口;不能把课程目录页当作已完成的在线课程。 - 互动学习界面必须围绕本课学习目标设计可操作的学习活动、最小示例或过程演示,且必须包含动手编写代码的微练习(初期 1~5 行),杜绝纯点击流转;并提供继续学习、完成反馈和资源不可用时的明确说明。 - 视频课件由仓库外的制作流程负责。本仓库不生成、存储、转码或播放视频资产;如需关联外部交付物,只记录课程 ID、外部资产标识、章节定位和来源状态,不能伪造视频可用性。 -- 在线测试只可从已审校的问题库随机组卷。每道题必须关联课程 ID、至少一个学习目标、难度、题型、正确答案和解析。 +- 在线测试只可从已通过校验的问题库随机组卷。每道题必须关联课程 ID、至少一个学习目标、难度、题型、正确答案和解析。 - 每一次组卷中的选择题数量必须严格多于非选择题;随机过程必须保留可复现的种子或等价试卷标识,同一次尝试不得重复出题。 - 作答完成后必须给出得分、逐题正误、解析和复习出口;题库为空、题目无效、网络资源不可用或提交中断时,必须明确告知并保持可恢复状态。 - 正式试题、答案与解析必须留下可追溯的校验证据(独立盲解 + 规则校验,证据写在 `docs/review/question-verification.json`,并由 `tests/question-verification.test.ts` 绑到题目内容上:题目一改,证据作废);页面与文档不得宣称“人工审校”或“已审校”,只能写“已通过校验”。逐题人工阅读是可选的加强项,不是发布前置条件(2026-09-21 由项目负责人确认)。引入第三方题目时仍必须记录授权或来源。 diff --git a/README.md b/README.md index 217e1e2..d4ae445 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ lessons/s5-08/ 每一节课程最终都应成为一个独立、可在线学习的单元,包含: - 与本课目标对应的网页互动学习界面; -- 可重复参加的在线测试,从经审校题库中随机组卷,并以选择题为主; +- 可重复参加的在线测试,从已通过校验的题库中随机组卷,并以选择题为主; - 作答结果、解析和下一步复习建议。 每节课还有对应的视频课件,但视频由仓库外的制作流程实现和交付;本仓库不制作、存储或渲染视频资产,只维护课程 ID、目标与外部视频交付的对齐约定。 @@ -250,17 +250,17 @@ bun run e2e:typed # 一次跑完上面全部 39 课,659 项检查 整课推进(从 `0 / N 已推进` 走到 `N / N`,外加小测本身)另有 `bun run e2e:flow`: ```bash -bun run e2e:flow # S1-02 至 S5-08 全部 39 课,741 项检查(每课 19 项) +bun run e2e:flow # S1-02 至 S5-08 全部 39 课,780 项检查(每课 20 项) bun run e2e:flow:s3 # 只跑第三阶段八课 CSP_E2E_LESSONS=s3-07 bun tests/e2e/flow-cdp.ts # 只跑一课 ``` 走完 `N / N` 之后,脚本还会确认页面自己把「继续学习」入口打开:写明下一课是 `Sx-xx` 与课名、先练的那件事, 链接直达下一课的 `index.html` 且真的可达(用 `HEAD` 请求验过),并且入口在没做完之前是隐藏的,不会把学习者 -中途引走。S5-08 是最后一课,入口改成课程收尾:说明五阶段 40 课已走完、建议怎么复盘、题目与解析仍待人工 -审校,并指回课程路线,不给成绩评定或能力认证的说法。 +中途引走。S5-08 是最后一课,入口改成课程收尾:说明五阶段 40 课已走完、建议怎么复盘、题目与解析已通过校 +验,并指回课程路线,不给成绩评定或能力认证的说法。 -它验的是「这节课整段路走得通不通」:跳步会被拦住并说明要先完成前一个任务、每一步都经过真实浏览器点击、完成时给出与本节目标对应的完成文案、刷新后进度仍在、清掉本地存储就回到起点;趁小测面板可见时再量一遍「每题把检查目标绑到本课学习目标原文并另起一行给出本题检查、一次抽出的三题互不重复且都是选择题、没答完不能提交、提交后才给解析与得分、没考住时按学习目标汇总错题并指回本节讲解且不倒退进度」。它与 `e2e:typed` 共用 [`tests/e2e/lesson-flows.ts`](./tests/e2e/lesson-flows.ts) 里的答案表,改一处两边同时生效;步骤与仍需人工确认的部分见 [`tests/e2e/flow-manual-checklist.md`](./tests/e2e/flow-manual-checklist.md)。 +它验的是「这节课整段路走得通不通」:跳步会被拦住并说明要先完成前一个任务、每一步都经过真实浏览器点击、完成时给出与本节目标对应的完成文案、刷新后进度仍在、清掉本地存储就回到起点;趁小测面板可见时再量一遍「每题把检查目标绑到本课学习目标原文并另起一行给出本题检查、一次抽出的三题互不重复且都是选择题、没答完不能提交、提交后才给解析与得分、没考住时按学习目标汇总错题且不倒退进度、复习出口真点一次就切到讲这条目标的任务并聚焦它的标题」。它与 `e2e:typed` 共用 [`tests/e2e/lesson-flows.ts`](./tests/e2e/lesson-flows.ts) 里的答案表,改一处两边同时生效;步骤与仍需人工确认的部分见 [`tests/e2e/flow-manual-checklist.md`](./tests/e2e/flow-manual-checklist.md)。 ## 键盘可达与焦点可见复验 diff --git a/docs/feature-checklist.md b/docs/feature-checklist.md index 01cb4d9..966c4b8 100644 --- a/docs/feature-checklist.md +++ b/docs/feature-checklist.md @@ -1,6 +1,6 @@ # 功能清单 -状态说明:`已完成` 表示首版已在仓库中落地;`下一步` 表示已确认方向但尚未承诺具体实现;`不做` 表示受项目边界约束。 +状态说明:`已完成` 表示首版已在仓库中落地;`待体验确认` 表示功能已落地并通过自动化复验(复验范围写在「验收结果」里),但观感、听感与窄屏排版这类只能由人判断的部分仍需学习者现场体验确认,页面与文档不得把它说成已经人工确认;`下一步` 表示已确认方向但尚未承诺具体实现;`不做` 表示受项目边界约束。 ## 首版交互课件 @@ -18,90 +18,90 @@ | 本地开发服务器内容边界 | 已完成 | `bun run dev` 只监听 `127.0.0.1`(可用 `HOST` 覆盖),并且只服务 `index.html`、`glossary/`、`lessons/` 这三份内容——内容清单与构建、线上 Worker 共用 `src/site.ts` 里同一份定义。`/.git/config`、`/.gitignore`、`/wrangler.jsonc`、`/AGENTS.md`、`/package.json`、`/docs/`、`/scripts/`、`/src/` 等仓库文件,以及越界与编码写法(`..`、`%2e%2e`、`%2f`、`%00`、坏编码),一律给出与线上一致的中文 404;少了末尾斜杠的目录地址与线上一样 307 跳转(目录不存在则不跳);`PORT`/`HOST` 非法或端口被占用会当场说清而不是静默换端口 | | 互动页面脚本语法校验 | 已完成 | `bun test` 逐一编译首页与全部 40 课内嵌脚本,语法错误会立即失败,弥补此前只做字符串匹配的盲区 | | 手工 E2E 验收 | 已完成 | 见 `tests/e2e/manual-checklist.md`;S1-01 的八个场景另可用 `bun run e2e:s1-01` 在无头 Chrome 自动重跑,S1-02 至 S1-08 的手写填空微练习可用 `bun run e2e:s1-typed` 自动重跑,S2-01 至 S2-08 的手写填空微练习可用 `bun run e2e:s2-typed` 自动重跑,S3-01 至 S3-08 用 `bun run e2e:s3-typed`,S4-01 至 S4-08 用 `bun run e2e:s4-typed`,S5-01 至 S5-08 用 `bun run e2e:s5-typed`,全部 39 节已迁移课用 `bun run e2e:typed` | -| 整课推进与随机小测浏览器复验 | 已完成 | `bun run e2e:flow` 把 S1-02 至 S5-08 全部 39 课从 `0 / N 已推进` 走到 `N / N`(741 项,每课 19 项),并逐课量「检查目标绑到本课学习目标原文、没答完不能提交、提交后才给解析与得分、没考住时按学习目标汇总错题并指回本节讲解且不倒退进度、没做完不提前引到下一课、完成后继续学习入口指向 `courseData` 的下一课且可达」;步骤与仍需人工确认的部分见 `tests/e2e/flow-manual-checklist.md` | +| 整课推进与随机小测浏览器复验 | 已完成 | `bun run e2e:flow` 把 S1-02 至 S5-08 全部 39 课从 `0 / N 已推进` 走到 `N / N`(780 项,每课 20 项),并逐课量「检查目标绑到本课学习目标原文、没答完不能提交、提交后才给解析与得分、没考住时按学习目标汇总错题并指回本节讲解且不倒退进度、没做完不提前引到下一课、完成后继续学习入口指向 `courseData` 的下一课且可达」;步骤与仍需人工确认的部分见 `tests/e2e/flow-manual-checklist.md` | | 课后继续学习入口 | 已完成 | 39 节非末课在走完 `N / N` 后自己打开「继续学习」,写明下一课是 `Sx-xx` 与课名、先练的那件事,并直达下一课的 `index.html`;没做完之前入口隐藏,不会把学习者中途引走。S5-08 作为最后一课换成课程收尾出口(说明五阶段 40 课已走完、怎么复盘、题目与解析已通过校验,并指回课程路线),不给成绩评定或能力认证的说法。`tests/next-lesson.test.ts` 锁住契约,`bun run e2e:flow` 在真实浏览器复验;步骤见 `tests/e2e/flow-manual-checklist.md` 的 E2E-FLOW-05 | | 手机端阅读 | 已完成 | 阶段栏和课程列表在窄屏下纵向重排 | | 40 个课程目录与元数据 | 已完成 | `lessons/s1-01/` 至 `lessons/s5-08/` 均有 `lesson.json`,由 Bun 脚手架和测试校验 | | S1-01 引导式互动课件 | 已完成 | 已实现程序入口识别、编译流程演示、分号排错(先选最小修复,再亲手补 1 个分号,含提示/参考/重置兜底)与本地进度恢复;`bun run e2e:s1-01` 在无头 Chrome 复验 88 项检查(含跳过步骤、错误选项、存储不可用、会话中途保存失败、词条表载入失败与词条面板脚本未载入的恢复),键盘操作、音效听感与窄屏排版仍需人工确认 | -| S1-01 随机选择题小测 | 已完成 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析;空题库或题目无效时明确告知并保留进度;两种题库异常均已由 `bun run e2e:s1-01` 自动复验 | +| S1-01 随机选择题小测 | 已完成 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析;空题库或题目无效时明确告知并保留进度;两种题库异常均已由 `bun run e2e:s1-01` 自动复验 | | S1-02 引导式互动课件 | 待体验确认 | 已实现类型选择、变量声明/赋值/更新、亲手写 1 行更新语句(含提示/参考/重置兜底)、char 与大整数分界、本地进度恢复;手写填空已由 `bun run e2e:s1-typed` 在无头 Chrome 复验(本课 17 项,含空提交、全角符号与把更新写成 `==` 而不是 `=`三类失败路径,重置会清掉输入框里残留的旧字),键盘操作、音效听感与窄屏排版仍需人工确认 | -| S1-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析;空题库或题目无效时明确告知并保留进度 | +| S1-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析;空题库或题目无效时明确告知并保留进度 | | S1-03 引导式互动课件 | 待体验确认 | 已实现公式选择、亲手写平均数算式(含提示/参考/重置兜底)、整除/取模演示、括号消歧义与本地进度恢复;手写填空已由 `bun run e2e:s1-typed` 在无头 Chrome 复验(本课 16 项,含空提交、全角符号与漏括号写成 `a + b / 2`三类失败路径,重置会清掉输入框里残留的旧字),键盘操作、音效听感与窄屏排版仍需人工确认 | -| S1-03 随机选择题小测 | 待体验确认 | 每套从 6 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S1-03 随机选择题小测 | 待体验确认 | 每套从 6 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S1-04 引导式互动课件 | 待体验确认 | 已实现连续 cin 读入选择、亲手写 1 行读入语句(含提示/参考/重置兜底)、空格/换行演示、竞赛提示语对照与本地进度恢复;手写填空已由 `bun run e2e:s1-typed` 在无头 Chrome 复验(本课 16 项,含空提交、全角符号与连续读入写成 `cin >> a, b;`三类失败路径,重置会清掉输入框里残留的旧字),键盘操作、音效听感与窄屏排版仍需人工确认 | -| S1-04 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S1-04 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S1-05 引导式互动课件 | 待体验确认 | 已实现 if/三路判断选择、60 分边界演示、= 与 == 对照、亲手补齐两行条件(含提示/参考代码/重写兜底)与本地进度恢复;手写填空已由 `bun run e2e:s1-typed` 在无头 Chrome 复验(本课 17 项,含空提交、全角符号与`>=` 丢掉等于三类失败路径,重置会清掉输入框里残留的旧字),键盘操作、音效听感与窄屏排版仍需人工确认 | -| S1-05 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S1-05 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S1-06 引导式互动课件 | 待体验确认 | 已实现 for/while 选择、亲手写 for 表头(含提示/参考/重置兜底)、1 到 3 累加演示、忘记 i++ 的死循环对照与本地进度恢复;手写填空已由 `bun run e2e:s1-typed` 在无头 Chrome 复验(本课 16 项,含空提交、全角符号与循环上界写成 `i < n`三类失败路径,重置会清掉输入框里残留的旧字),键盘操作、音效听感与窄屏排版仍需人工确认 | -| S1-06 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S1-06 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S1-07 引导式互动课件 | 待体验确认 | 已实现内外层职责选择、亲手写内层循环(含提示/参考/重置兜底)、3 行 3 列图案演示、break 与 continue 对照与本地进度恢复;手写填空已由 `bun run e2e:s1-typed` 在无头 Chrome 复验(本课 16 项,含空提交、全角符号与内层循环变量写成 `r`三类失败路径,重置会清掉输入框里残留的旧字),键盘操作、音效听感与窄屏排版仍需人工确认 | -| S1-07 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S1-07 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S1-08 引导式互动课件 | 待体验确认 | 已实现三类错误对照、少分号定位、亲手补分号(含提示/参考/重置兜底)、最小数据与分段输出、本地进度恢复;手写填空已由 `bun run e2e:s1-typed` 在无头 Chrome 复验(本课 17 项,含空提交、全角符号与多写字符写成 `;n`三类失败路径,重置会清掉输入框里残留的旧字),键盘操作、音效听感与窄屏排版仍需人工确认 | -| S1-08 随机选择题小测 | 待体验确认 | 每套从 6 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S1-08 随机选择题小测 | 待体验确认 | 每套从 6 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S2-01 引导式互动课件 | 待体验确认 | 已实现数组声明选择、下标 0 到 n-1 演示、亲手写 `a[n - 1]`(含提示/参考/重置兜底)、越界对照、遍历求最大与本地进度恢复 | -| S2-01 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S2-01 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S2-02 引导式互动课件 | 待体验确认 | 已实现 char/string 选择、s[0] 到 s[n-1] 演示、亲手写 `s[n - 1]`(含提示/参考/重置兜底)、字符统计与数字判断、本地进度恢复 | -| S2-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S2-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S2-03 引导式互动课件 | 待体验确认 | 已实现偶数函数选择、调用/参数/返回值演示、亲手写 `isEven(4)`(含提示/参考/重置兜底)、闰年抽取、本地进度恢复 | -| S2-03 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S2-03 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S2-04 引导式互动课件 | 待体验确认 | 已实现局部变量可见范围选择、值传递 n 不变演示、亲手写 `int x`(含提示/参考/重置兜底)、同名与引用对照、本地进度恢复 | -| S2-04 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S2-04 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S2-05 引导式互动课件 | 待体验确认 | 已实现结构体记录卡选择、成员写入/读出演示、亲手写 `a[0].score`(含提示/参考/重置兜底)、结构体数组与按字段比较、本地进度恢复 | -| S2-05 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S2-05 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S2-06 引导式互动课件 | 待体验确认 | 已实现冒泡思想选择、3/1/2 相邻交换演示、亲手写 `swap(a[0], a[1])`(含提示/参考/重置兜底)、sort 与稳定性对照、本地进度恢复 | -| S2-06 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S2-06 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S2-07 引导式互动课件 | 待体验确认 | 已实现枚举范围选择、1 到 3 数偶数的状态演示、亲手写 `if (i % 2 == 0) evenCount++;`(漏分支、整除、条件写反、单个 `=`、漏分号都会点出原因,含提示/参考/重置兜底)、漏分支对照、本地进度恢复 | -| S2-07 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S2-07 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S2-08 引导式互动课件 | 待体验确认 | 已实现操作次数选择、n=3 单层/双层对照、亲手写 `n * n`(写成 `n + n`、单层、`^` 当乘方、多套一层或写死数字都会点出原因,含提示/参考/重置兜底)、大 n 写法与测试点、本地进度恢复 | -| S2-08 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S2-08 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S3-01 引导式互动课件 | 待体验确认 | 已实现数位拆法选择、125 逐步拆位、亲手写 `x % 10`(空提交/全角百分号/写成 `x / 10` 都被具体指正,只做文字规则检查,不编译或执行学习者写的 C++)、GCD 与循环停止对照、本地进度恢复 | -| S3-01 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S3-01 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S3-02 引导式互动课件 | 待体验确认 | 已实现递归拆法选择、countdown(3) 三层追踪、亲手写 `n * fact(n - 1)`(到不了边界、漏一层、忘了乘当前层都被具体指正,只做文字规则检查)、阶乘与无限递归对照、本地进度恢复 | -| S3-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S3-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S3-03 引导式互动课件 | 待体验确认 | 已实现有序/单调前提选择、[1,3,5,7,9] 找 7 的区间收缩、亲手写 `(left + right) / 2`(漏括号、写成乘 2 都被具体指正,安全写法 `left + (right - left) / 2` 标为拓展但同样接受,只做文字规则检查)、首尾与死循环对照、本地进度恢复 | -| S3-03 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S3-03 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S3-04 引导式互动课件 | 待体验确认 | 已实现前缀和定义选择、[2,5,1,4] 填表、亲手写 `sum[i] = sum[i - 1] + a[i]`(空提交/全角方括号等号加号/漏减 1 写成 `sum[i]`、漏 `a[i]`、下标错位到 `a[i - 1]`、方向反成 `sum[i + 1]`、只加相邻两格、把下标 `i` 当数组元素都会被具体指正,只做文字规则检查)、区间公式与 l=1/下标偏移对照、本地进度恢复 | -| S3-04 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S3-04 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S3-05 引导式互动课件 | 待体验确认 | 已实现双指针含义选择、[1,2,3] 窗口扩张、亲手写 `right++; sum += a[right];`(空提交/全角加号分号方括号/两步顺序反了、用减号、下标写成 `a[left]`、只移不加、只加不移、移错成 `left++`、用 `=` 覆盖窗口和、方向反成 `right--` 都会被具体指正,只做文字规则检查)、空/满窗口与移动时机对照、本地进度恢复 | -| S3-05 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S3-05 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S3-06 引导式互动课件 | 待体验确认 | 已实现贪心规则选择、三个活动逐步选取、亲手写 `sort(a + 1, a + 4, by_end)`(空提交/全角括号加号逗号/按开始时间排、按时长排、比较规则名字写错、漏掉第三个参数、起点写成 `a` 把 `a[0]` 排进去、终点写成 `a + 3` 少排一个、起止写反都会被具体指正,只做文字规则检查)、空选择与时长最长反例对照、本地进度恢复 | -| S3-06 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S3-06 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S3-07 引导式互动课件 | 待体验确认 | 已实现栈/队列选择、([]) 入栈出栈、亲手写 `st.pop();`(空提交/全角符号/只看一眼的 `st.top()`、`st.empty()`、又压一个的 `st.push()`、只数数的 `st.size()`、漏掉栈名都被具体指正,只做文字规则检查,不编译或执行学习者代码)、空栈与 ([)] 错配对照、本地进度恢复 | -| S3-07 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S3-07 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S3-08 引导式互动课件 | 待体验确认 | 已实现动态规划含义选择、爬楼梯前三步手算、亲手写 `dp[i] = dp[i - 1] + dp[i - 2];`(空提交/全角符号/写成 `dp[i + 1]`、右边又用 `dp[i]`、把两类走法相乘、`i - 1` 用两次、忘了加 `dp[i - 2]` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、初值与 n=1 对照、本地进度恢复 | -| S3-08 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S3-08 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S4-01 引导式互动课件 | 待体验确认 | 已实现竞赛程序规范选择、圈范围/删提示语/对样例三步、亲手写 `cout << n + 1;`(空提交/全角符号/漏分号/多写提示语、给答案加引号或原样输出 n 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、干净输出对照、本地进度恢复 | -| S4-01 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S4-01 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S4-02 引导式互动课件 | 待体验确认 | 已实现建模卡含义选择、已知/目标/样例反推三步、亲手写 `sum += a[i];`(空提交/全角符号/漏分号/写成 `sum = a[i]` 覆盖前面的和、只写 `i` 或写成 `a[n]` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、算法候选与两个边界对照、本地进度恢复 | -| S4-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S4-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S4-03 引导式互动课件 | 待体验确认 | 已实现模拟思路/条件分支选择、状态/事件顺序/样例追踪三步、亲手写 `if (balance + x >= 0)`(空提交/全角符号/边界写成 `>` 漏掉刚好把余额用完的情况、方向写反成 `<= 0` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、处理思路与两个边界对照、本地进度恢复 | -| S4-03 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S4-03 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S4-04 引导式互动课件 | 待体验确认 | 已实现搜索思路/剪枝条件选择、选择/剪枝判断/回溯三步、亲手写 `if (sum > target) return;`(空提交/全角符号/漏分号/边界写成 `>=` 把和刚好等于目标的分支也剪掉、用 `break` 代替 `return` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、处理思路与两个边界对照、本地进度恢复 | -| S4-04 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S4-04 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S4-05 引导式互动课件 | 待体验确认 | 已实现计数数组/排序工具选择、排序/扫描/记录三步、亲手写 `cnt[score]++;`(空提交/全角符号/漏分号/写成 `cnt[score] = 1;` 覆盖已数好的次数、漏掉方括号下标或写成 `cnt[i]` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、处理思路与两个边界对照、本地进度恢复 | -| S4-05 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S4-05 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S4-06 引导式互动课件 | 待体验确认 | 已实现状态定义(选或不选)/枚举对照选择、状态/初始化/转移三步、亲手写 `dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);`(空提交/全角符号/漏分号/两边都写 `dp[i - 1]` 等于允许相邻两家、漏掉不选 i 那条路、下标写成 `dp[i + 1]` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、处理思路与两个边界对照、本地进度恢复 | -| S4-06 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S4-06 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S4-07 引导式互动课件 | 待体验确认 | 已实现图的表示(邻接表)/访问标记对照选择、邻接表/访问标记/DFS 三步数连通块、亲手写 `if (visited[u]) return;`(空提交/全角符号/漏分号/条件写反成 `!visited[u]`、判断 `adj[u]` 或 `deg[u]`、用 `break` 代替 `return` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、DFS 与 BFS 顺序差异与两个边界对照、本地进度恢复 | -| S4-07 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S4-07 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S4-08 引导式互动课件 | 待体验确认 | 已实现做题顺序/保底方案对照选择、划分子任务/保底方案/优化冲刺三步、亲手写 `if (n <= 1000) { cout << brute(n); return 0; }`(空提交/全角符号/边界漏等号或把 1000 写成 100、范围判断用 `while` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、先易后难与检查时间安排两个边界对照、本地进度恢复 | -| S4-08 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S4-08 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S5-01 引导式互动课件 | 待体验确认 | 已实现审题计时/不跳过样例对照选择、审题/草稿/对照样例三步、亲手写 `int a[100005];`(空提交/全角符号/拿变量 `n` 当数组大小、漏掉类型 `int`、漏分号都被具体指正,开得比范围更宽是允许的、会被说明,只做文字规则检查,不编译或执行学习者代码)、预留检查时间与样例态度两个边界对照、本地进度恢复 | -| S5-01 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S5-01 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S5-02 引导式互动课件 | 待体验确认 | 已实现最小复现/分段输出对照选择、缩小/分段输出/回归三步、亲手写 `cout << i << " " << prefix;`(空提交/全角符号/漏分号/写成分段输出以外的读入方向、只打其中一个值、变量名加引号都被具体指正,只做文字规则检查,不编译或执行学习者代码)、断言思路与回归测试两个边界对照、本地进度恢复 | -| S5-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S5-02 随机选择题小测 | 待体验确认 | 每套从 5 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S5-03 引导式互动课件 | 待体验确认 | 已实现溢出/越界故障卡诊断选择、定位/改型/回归三步、亲手写 `long long sum = 0;`(空提交/全角符号/漏分号/仍写 `int` 或 `unsigned int`、只写 `long`、少初值或把 `sum` 写成 `Sum` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、比较符号与调试残留两个边界对照、本地进度恢复 | -| S5-03 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S5-03 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S5-04 引导式互动课件 | 待体验确认 | 已实现开始策略/标注限制选择、基线/标注/升级三步、亲手写 `sum[r] - sum[l - 1];`(空提交/全角符号/减反成 `sum[l] - sum[r]`、用加法、从数组 `a` 里取、拿长度 `n` 当右端点、多减或多加 1 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、伪优化识别与验证方式两个边界对照、本地进度恢复 | -| S5-04 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S5-04 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S5-05 引导式互动课件 | 待体验确认 | 已实现开始顺序/记录方式选择、浏览排序/自测记录/时间检查三步、亲手写 `if (n == 0) { cout << 0 << "\n"; return 0; }`(空提交/全角符号/只写一个等号、拿 `a[1]` 当空数据判断、条件写成 `n >= 0` 太宽、用 `while`、漏掉 `return 0;` 或输出都被具体指正,只做文字规则检查,不编译或执行学习者代码)、时间不够时的处理与自测表记录方式两个边界对照、本地进度恢复 | -| S5-05 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S5-05 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S5-06 引导式互动课件 | 待体验确认 | 已实现分类优先/改法方向选择、找错/归类/写改法并重做三步、亲手写 `i <= n`(空提交/全角符号/写成 `i < n` 或 `i + 1 <= n` 都漏掉最后一个下标、`i > n` 方向反、把上界写成数组大小 `105` 都被具体指正,只做文字规则检查,不编译或执行学习者代码)、时间不够时的处理与拿不准分类记录方式两个边界对照、本地进度恢复 | -| S5-06 随机选择题小测 | 待体验确认 | 每套从 8 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S5-06 随机选择题小测 | 待体验确认 | 每套从 8 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S5-07 引导式互动课件 | 待体验确认 | 已实现开始前带上上次习惯/交叉检查判断选择、独立解题/交叉检查/习惯记录三步、亲手写 `long long formula = 1LL * n * (n + 1) / 2;`(空提交/全角符号/漏分号/漏掉 `1LL` 让 `n * (n + 1)` 按 `int` 溢出都被具体指正,两个因数交换顺序等价会被说明,只做文字规则检查,不编译或执行学习者代码)、对照两次时间分配与习惯是否稳定两个边界对照、本地进度恢复 | -| S5-07 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S5-07 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | S5-08 引导式互动课件 | 待体验确认 | 已实现整理知识地图/标注薄弱模块判断选择、知识地图/薄弱项标记/赛前清单三步、亲手写 `int cnt[105] = {0};`(空提交/全角符号/写成 `= 0` 只清第一个格子、只声明不给初值、漏掉类型 `int`、漏分号都被具体指正,只做文字规则检查,不编译或执行学习者代码)、薄弱模块复习优先级与 CSP-S 衔接边界两个边界对照、本地进度恢复 | -| S5-08 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题;提交后给出分数与逐题解析 | +| S5-08 随机选择题小测 | 待体验确认 | 每套从 7 道已通过校验的选择题中随机抽取 3 道;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(`bun run e2e:flow` 每课真点一次:面板真的切换、焦点落到该任务标题);提交后给出分数与逐题解析 | | 初学者常见问题词条 | 已完成 | 共享 `glossary/faq.json`;S1-01 中 `g++`、`.cpp`、`main` 等可点开基础解释;S1-02 中 `int`、`char`、变量、赋值等同样可点开;S1-03 中表达式、整除、取模、优先级、括号同样可点开;S1-04 中 `cin`、换行、固定小数、提示语同样可点开;S1-05 中 `if`、`else if`、`==`、`&&` 同样可点开;S1-06 中 `for`、`while`、循环变量、累加、死循环同样可点开;S1-07 中嵌套循环、外层、内层、`break`、`continue` 同样可点开;S1-08 中编译错误、运行错误、答案错误、缩进、命名、分段输出同样可点开;S2-01 中数组、下标、长度、初始化、越界同样可点开;S2-02 中 `char`、`string`、长度、下标、ASCII 同样可点开;S2-03 中函数、参数、返回值、调用、定义同样可点开;S2-04 中作用域、局部变量、全局变量、值传递、引用同样可点开;S2-05 中结构体、成员、成员访问、结构体数组、按字段比较同样可点开;S2-06 中冒泡思想、sort、比较规则、交换、稳定性同样可点开;S2-07 中枚举、枚举范围、状态更新、模拟、漏分支同样可点开;S2-08 中操作次数、O(n)、O(n²)、边界数据、测试点同样可点开;S3-01 中整除、取模、数位、最大公约数、循环不变量同样可点开;S3-02 中递归、递归边界、递归调用、调用栈、阶乘同样可点开;S3-03 中二分查找、单调性、左右边界、中点、死循环同样可点开;S3-04 中前缀和、前缀和数组、区间和、下标偏移、O(n) 同样可点开;S3-05 中双指针、滑动窗口、左指针、右指针、窗口条件同样可点开;S3-06 中贪心选择、选择标准、反例、排序后决策、sort 同样可点开;S3-07 中栈、队列、后进先出、先进先出、括号匹配、广度优先直觉同样可点开;S3-08 中动态规划、状态、转移、初始化、一维 DP 同样可点开;S4-01 中竞赛程序、数据范围、样例、标准输入输出、干净输出同样可点开;S4-02 中建模卡、已知与未知、样例反推、约束、算法候选同样可点开;S4-03 中状态表、事件顺序、条件分支、样例追踪、边界数据同样可点开;S4-04 中深度优先搜索、搜索树、回溯、剪枝同样可点开;S4-05 中数据范围、sort、二分查找、计数数组、重复元素同样可点开;S4-06 中状态、转移、初始化、选或不选、最优子结构、状态压缩同样可点开;S4-07 中图、邻接表、访问标记、深度优先搜索、广度优先直觉、连通块同样可点开;S4-08 中子任务、部分分、保底方案、先易后难、复杂度降级同样可点开;S5-01 中限时解题流程、审题计时、建模草稿、样例检查、预留检查时间同样可点开;S5-02 中系统化调试、最小复现、分段输出、断言思路、差分检查同样可点开;S5-03 中溢出、long long、数组初始化、下标越界、运算优先级、== 比较相等、干净输出同样可点开;S5-04 中暴力基线、子任务、特殊情况、复杂度升级、伪优化、差分检查同样可点开;S5-05 中模拟赛、提交顺序、自测表、时间记录同样可点开;S5-06 中错误分类、边界数据、改法、重做关键题同样可点开;S5-07 中新题组、交叉检查、对照上一次、稳定习惯同样可点开;S5-08 中知识地图、薄弱模块、赛前检查清单、CSP-S 衔接条件同样可点开。词条表载入失败(含返回 HTTP 错误)时,面板当场说明并给出“重新载入词条表”入口,恢复后回到刚才点开的词条,课件其他互动不受影响 | ## 后续在线课程能力 @@ -110,7 +110,7 @@ | --- | --- | --- | | 40 节专属在线学习界面 | 已完成 | `lessons/s1-01/` 至 `lessons/s5-08/` 均有与目标对应的学习活动、过程演示/最小示例、进度反馈与资源异常说明 | | 每课配套视频课件 | 仓库外实现 | 视频制作、存储和播放不在本仓库;仅可按课程 ID 关联外部交付状态,不伪造可用性 | -| 40 节随机在线测试 | 已完成 | 每课从 5 至 7 道已通过校验的题库随机组卷;选择题数量严格多于非选择题;完成后展示得分、解析和复习出口;空题库或题目无效时明确告知并保留进度;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题 | +| 40 节随机在线测试 | 已完成 | 每课从 5 至 7 道已通过校验的题库随机组卷;选择题数量严格多于非选择题;完成后展示得分、逐题正误与解析,并把没考住的目标点回讲它的那个任务(复习出口真的能点、能切、能聚焦);空题库或题目无效时明确告知并保留进度;每题把检查目标绑到本课学习目标原文并另起一行说明本题检查,未通过时按学习目标汇总错题 | | 题库与组卷质量控制 | 已完成 | 每道题关联课程 ID、学习目标、难度、题型、正确答案、解析与来源;同次不重复,试卷用种子标识复现;题目统一标记为已通过机器校验。难度档位统一为必会 `required` / 建议掌握 `recommended` / 拓展 `stretch`,由 `tests/lesson-contract.test.ts` 逐课校验;抽出来的那 3 道题另由 `tests/quiz-paper-contract.test.ts` 在 256 个种子下校验题数、同次不重复、只出选择题、同一试卷标识可复现、题库内每题都抽得到,以及抽题不会就地改写题库 | | 学习尝试恢复 | 已完成 | 保存失败(含会话中途失败)当次会话立刻可见、可点“重试保存”;恢复后说明“本地保存已恢复”并把期间待写进度补写落盘;词条表载入失败同样当场说明、可点“重新载入词条表”,恢复后回到刚才点开的词条。两类失败都不伪造成功 | | 先修关系可见与可达 | 已完成 | 全部 40 课都由 `bun run e2e:prereq` 在无头 Chrome 里复验(242 项检查:40 课各 6 项,5 项笔记本视口 + 1 项手机竖屏,另含脚本自检 2 项),覆盖先修块整块落在首屏、文字与 `courseData` 一致、链接全部可达、键盘走得到焦点环可见、真实鼠标点击真的进得去,以及手机竖屏下的同一块 | @@ -124,7 +124,7 @@ - 在线编译、执行或评测任意用户 C++ 代码 - 账号体系、排名、班级社交、公开作答和个人画像 - 未标记来源的大量题目转载或“保过”式承诺 -- 未经审校或无法复现的随机试题、答案和解析 +- 未通过校验或无法复现的随机试题、答案和解析 - 以高级竞赛算法替代零基础 C++ 核心训练 ## 内容发布检查 diff --git a/docs/roadmap.md b/docs/roadmap.md index 69fac01..e7991ee 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -64,7 +64,7 @@ - **微编程输入框契约校验**:`tests/typed-practice-contract.test.ts` 用“已迁移的课必须一直守住完整契约、未迁移的课显式登记待办”的方式守住 AGENTS.md 的动手编程要求——输入框的移动端防大写/防纠错属性、等宽字体、焦点态、检查/提示/参考代码/重置四类兜底、读屏播报、草稿与完成状态落盘,以及“不把学习者输入当代码执行”。本轮起 40 节课全部有了微编程输入框,尚未迁移的 0 节课:新课没有输入框、或补完却忘了从清单划掉,都会当场失败。 - **组卷(试卷级)契约校验**:`tests/quiz-paper-contract.test.ts` 把每课页面的 `seededRandom` / `questionSetForSeed` / `questionsAreValid` 原样取出来在沙箱里跑,用 256 个种子验「抽出来的那 3 道题」——题数与课程清单一致、同次不重复、只出选择题、正确答案在选项内、同一个试卷标识永远组出同一套题、题库里每道题都抽得到,且抽题不会就地改写题库本身;随机数序列另行锁死,因为改掉它会让学习者存下来的试卷标识指向另一套题。空题库、答案越界、题型不符、缺少题干必须被判为不可用。新增课节时无需手写用例即可被覆盖。 - **单课浏览器自动化复验**:`bun run e2e:s1-01` 用无头 Chrome 与 CDP 把 S1-01 的八个体验场景在真实浏览器里重跑一遍(88 项检查),自行启停开发服务器与浏览器;`bun run e2e:s1-typed` 用同一套样板复验 S1-02 至 S1-08 的手写填空微练习(115 项检查,每课含三类失败路径与刷新恢复),`bun run e2e:s2-typed` 复验 S2-01 至 S2-08(136 项检查),`bun run e2e:s3-typed` 复验 S3-01 至 S3-08(136 项检查),`bun run e2e:s4-typed` 复验 S4-01 至 S4-08(136 项检查),`bun run e2e:s5-typed` 复验 S5-01 至 S5-08(136 项检查),`bun run e2e:typed` 一次跑完全部 39 节已迁移课(659 项检查)。它们不属于 `bun test`,因为断言依赖真实渲染。后续课节可以照这个样板补齐自动化复验。 -- **整课推进浏览器自动化复验**:`bun run e2e:flow` 用无头 Chrome 与 CDP 把 S1-02 至 S5-08 全部 39 节已迁移课从 `0 / N 已推进` 走到 `N / N`(741 项,每课 19 项):跳步会被拦住、每一步都经过真实浏览器点击、完成时给出可见文案、刷新后进度仍在、清掉本地存储就回到起点,并趁小测面板可见时量「检查目标绑到本课学习目标原文、没答完不能提交、提交后才给解析与得分、没考住时按学习目标汇总错题并指回本节讲解且不倒退进度」;走完 `N / N` 后再量「没做完之前继续学习入口是隐藏的」与「入口打开后写明下一课是 `Sx-xx` 与课名、直达下一课且真的可达(`HEAD` 请求验过),最后一课换成课程收尾出口」。脚本以页面自己的 `unlockedStepCount()`为进度准绳、只在空位真的露出来时才填、按组试互斥选项而不是全点一遍,答案表与 `bun run e2e:typed` 共用 `tests/e2e/lesson-flows.ts`;它不属于 `bun test`:断言依赖真实浏览器渲染,属于体验验收而不是单元测试。 +- **整课推进浏览器自动化复验**:`bun run e2e:flow` 用无头 Chrome 与 CDP 把 S1-02 至 S5-08 全部 39 节已迁移课从 `0 / N 已推进` 走到 `N / N`(780 项,每课 20 项):跳步会被拦住、每一步都经过真实浏览器点击、完成时给出可见文案、刷新后进度仍在、清掉本地存储就回到起点,并趁小测面板可见时量「检查目标绑到本课学习目标原文、没答完不能提交、提交后才给解析与得分、没考住时按学习目标汇总错题且不倒退进度、错题汇总下面的复习出口真点一次就会切到讲这条目标的任务并把焦点交给它的标题」;走完 `N / N` 后再量「没做完之前继续学习入口是隐藏的」与「入口打开后写明下一课是 `Sx-xx` 与课名、直达下一课且真的可达(`HEAD` 请求验过),最后一课换成课程收尾出口」。脚本以页面自己的 `unlockedStepCount()`为进度准绳、只在空位真的露出来时才填、按组试互斥选项而不是全点一遍,答案表与 `bun run e2e:typed` 共用 `tests/e2e/lesson-flows.ts`;它不属于 `bun test`:断言依赖真实浏览器渲染,属于体验验收而不是单元测试。 - **课后继续学习入口**:39 节非末课在走完 `N / N` 后由页面自己打开 `#nextStep`:写明下一课是 `Sx-xx` 与课名、先练的那件事(首条学习目标原文),链接直达下一课的 `index.html`,并再次说明进度只保存在这台设备的浏览器里。没做完之前这个入口是隐藏的,不会把还在这一课上的学习者提前引走。S5-08 是最后一课,入口换成课程收尾:说明五阶段 40 课已经走完、建议怎么复盘、题目与解析已通过校验,并指回课程路线;这里不给成绩评定、证书或任何能力认证的说法。`tests/next-lesson.test.ts` 逐课锁住这条契约(下一课按 `courseData` 顺序推导,标题与前一条学习目标必须与课程数据逐字一致,链接文件必须存在,导航必须排在「视频边界」说明之后),`bun run e2e:flow` 在真实浏览器里复验同一条路径。 - **学习尝试恢复**:全部 40 课与首页在浏览器拒绝写入本地存储时,会在当次会话立刻说明“这次没有保存成功、刷新后不会恢复进度”,并给出“重试保存”入口;恢复后提示消失、说明“本地保存已恢复”,并把期间待写的进度补写落盘。保存失败期间互动不中断,也绝不显示成“已保存”的分数或进度。`tests/storage-recovery.test.ts` 逐课启动内联脚本验证这条路径。 - **首节随机选择题小测**:S1-01 会从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析;空题库或题目无效时明确告知并保留进度。 @@ -156,7 +156,7 @@ ### 随机在线测试与有效复习 -每节课应提供可重复参加的在线测试。每次测试从已审校、带目标标签的问题库中抽取不同题目;选择题严格占多数,但可以保留少量适合该课的非选择题。随机过程要可复现,同一次尝试不得重复出题,提交后必须显示得分、逐题解析及指向薄弱目标的复习出口。测试要测“是否理解本课”,不能以陌生难题替代教学。 +每节课应提供可重复参加的在线测试。每次测试从已通过校验、带目标标签的问题库中抽取不同题目;选择题严格占多数,但可以保留少量适合该课的非选择题。随机过程要可复现,同一次尝试不得重复出题,提交后必须显示得分、逐题解析及指向薄弱目标的复习出口。测试要测“是否理解本课”,不能以陌生难题替代教学。 ### 课程事实与质量控制 @@ -200,91 +200,91 @@ | 先修关系可见与可达(全部 40 课样板) | 中 | ✅ 全部 40 节课逐课在真实浏览器里复验「进页面第一眼就知道要先会什么、而且点得回去」:`bun run e2e:prereq` 242 项检查(40 课各 6 项:5 项笔记本视口检查 + 1 项手机竖屏检查;另含脚本自检 2 项。2026-09-21 Chrome 153 无头) | ✅ 指向不存在课程的死链、链接被其它元素盖住、先修块被挤出首屏、键盘走不到、页面文字与 `courseData` 不一致都会失败;脚本自检会先插一条死链并确认它被抓到,检查器空转同样失败 | 不适用:无账号 | 不适用:只读导航,不修改状态 | [`tests/prerequisite-path.test.ts`](../tests/prerequisite-path.test.ts)、[`tests/e2e/prereq-cdp.ts`](../tests/e2e/prereq-cdp.ts)、[`tests/e2e/prereq-manual-checklist.md`](../tests/e2e/prereq-manual-checklist.md) | | 键盘可达与焦点可见(全部 40 课样板) | 中 | ✅ 全部 40 课逐课复验「不用鼠标也能走完,而且始终看得见焦点在哪」:`bun run e2e:keyboard` 在真实浏览器里发真实按键事件,328 项检查(结构检查每课 8 项 + S1-02 与 S3-01 的键盘深路径每课 4 项),覆盖 `Tab` 绕圈每个停靠点都有可见焦点环、没有正数 `tabindex` 打乱自然顺序、原生控件没被 `tabindex="-1"` 移出 `Tab` 顺序、没有「看着能点、键盘够不到」的元素、音效开关 `Space` 能切换且 `aria-pressed` 与文案同步、词条 `Enter` 打开 / `Esc` 关闭并把焦点交还刚才那个词条、步进轨道每一步(含锁着的)都在 `Tab` 顺序里 | ✅ 焦点丢失这条高风险失败路径逐课看住:作答重画题面后必须把焦点交还刚答的那一项、提交成功后必须交给结果区 `#quizResult`(此前两处都会掉回文档主体);`bun test` 里的 `tests/keyboard-access-contract.test.ts` 反向锁住这两个恢复动作被删掉或挪错位置,按 `courseData` 派生所以新课自动纳入 | 不适用:无账号 | ✅ 步进门闩 `Tab` 够得到但 `Enter` 与 `Space` 都推不动进度,面板照旧藏着且状态区说明原因;词条面板关闭后焦点回到刚才那个词条而不是文档开头;清掉本地存储后键盘路径仍可重走 | [`tests/keyboard-access-contract.test.ts`](../tests/keyboard-access-contract.test.ts)、[`tests/e2e/keyboard-cdp.ts`](../tests/e2e/keyboard-cdp.ts)、[`键盘清单`](../tests/e2e/keyboard-manual-checklist.md#自动化复验记录) | | S1-01 引导式在线学习界面 | 中 | ✅ 已复验:88 项浏览器检查(`bun run e2e:s1-01`,2026-09-21 Chrome 153 无头) | ✅ 错误选择、未解锁任务、存储不可用、会话中途保存失败、词条表载入失败与词条面板脚本未载入均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制并可重试保存;词条表失败时可重新载入;面板脚本载入失败时给出重新载入本课入口 | [`S1-01 E2E`](../tests/e2e/s1-01-manual-checklist.md#自动化复验记录)、[`tests/e2e/s1-01-cdp.ts`](../tests/e2e/s1-01-cdp.ts) | -| S1-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误类型、跳过声明/赋值和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-02 E2E`](../tests/e2e/s1-02-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-03 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误公式、跳过整除/取模和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-03 E2E`](../tests/e2e/s1-03-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-04 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误读入、跳过空格/换行和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-04 E2E`](../tests/e2e/s1-04-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误判断、跳过 90/60 分提问、条件写错(用 > 或单个 =、中文符号、数字写错)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、条件草稿与答题状态;条件检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S1-05 E2E`](../tests/e2e/s1-05-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`tests/s1-05-typed-condition.test.ts`](../tests/s1-05-typed-condition.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-06 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误循环、跳过 i=1/i=2 累加和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-06 E2E`](../tests/e2e/s1-06-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-07 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误内外层、跳过第 1/2 行和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-07 E2E`](../tests/e2e/s1-07-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误分类、跳过读报错/定位行和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-08 E2E`](../tests/e2e/s1-08-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-01 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误存法/下标、跳过 a[0]/a[1]、漏写或写错 `a[n - 1]`(空提交、全角方括号、越界写法)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-01 E2E`](../tests/e2e/s2-01-manual-checklist.md)、[`tests/s2-01-typed-last-index.test.ts`](../tests/s2-01-typed-last-index.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误存法、跳过 s[0]/s[1]、漏写或写错 `s[n - 1]`(空提交、全角方括号、越界写法)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-02 E2E`](../tests/e2e/s2-02-manual-checklist.md)、[`tests/s2-02-typed-last-char.test.ts`](../tests/s2-02-typed-last-char.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-03 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误抽法/返回、跳过调用/参数、漏写或写错 `isEven(4)`(空提交、全角小括号、只写函数名、参数或大小写不符)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-03 E2E`](../tests/e2e/s2-03-manual-checklist.md)、[`tests/s2-03-typed-function-call.test.ts`](../tests/s2-03-typed-function-call.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-04 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误可见范围/值传递、跳过调用/副本、漏写或写错 `int x`(空提交、全角符号、写成 `int &x` 引用或 `int *x` 指针、参数名与函数体对不上)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-04 E2E`](../tests/e2e/s2-04-manual-checklist.md)、[`tests/s2-04-typed-pass-by-value.test.ts`](../tests/s2-04-typed-pass-by-value.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误存法/成员访问、跳过定义/写入、漏写或写错 `a[0].score`(空提交、全角点号或方括号、写成 `->`、取错成员、漏下标或下标写错)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-05 E2E`](../tests/e2e/s2-05-manual-checklist.md)、[`tests/s2-05-typed-member-access.test.ts`](../tests/s2-05-typed-member-access.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误排法/比较规则、跳过 3 和 1 / 3 和 2 交换、漏写或写错 `swap(a[0], a[1])`(空提交、全角括号或逗号、换同一格、跳到不相邻的格、直接赋值或漏括号)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-06 E2E`](../tests/e2e/s2-06-manual-checklist.md)、[`tests/s2-06-typed-swap.test.ts`](../tests/s2-06-typed-swap.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-07 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误范围/状态、跳过 i=1 / i=2、漏写或写错 `if (i % 2 == 0) evenCount++;`(空提交、全角括号百分号分号、只加一不判断、用 `3 / 2` 整除、条件写成 `i % 2 == 1` 或单个 `=`、漏分号、改错变量)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-07 E2E`](../tests/e2e/s2-07-manual-checklist.md)、[`tests/s2-07-typed-enum.test.ts`](../tests/s2-07-typed-enum.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误估法/次数、跳过单层/双层、漏写或写错 `n * n`(空提交、全角乘号、写成 `n + n`、只写单层 `n`、用 `^` 当乘方、多套一层、写死数字)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-08 E2E`](../tests/e2e/s2-08-manual-checklist.md)、[`tests/s2-08-typed-complexity.test.ts`](../tests/s2-08-typed-complexity.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-01 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误拆法/停止条件、跳过 125 的中间步、漏写或写错 `x % 10`(空提交、全角百分号、写成 `x / 10` 或 `x % 100`)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-01 E2E`](../tests/e2e/s3-01-manual-checklist.md)、[`tests/s3-01-typed-digit.test.ts`](../tests/s3-01-typed-digit.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误拆法/终止条件、跳过 countdown(2)、漏写或写错 `n * fact(n - 1)`(空提交、全角括号与减号、写成 `n * fact(n)` 到不了边界或 `n * fact(n - 2)` 漏项)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-02 E2E`](../tests/e2e/s3-02-manual-checklist.md)、[`tests/s3-02-typed-recursion.test.ts`](../tests/s3-02-typed-recursion.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-03 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误前提/边界含义、跳过 a[2]=5、漏写或写错 `(left + right) / 2`(空提交、全角括号加号除号、漏括号写成 `left + right / 2`、写成乘 2)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-03 E2E`](../tests/e2e/s3-03-manual-checklist.md)、[`tests/s3-03-typed-midpoint.test.ts`](../tests/s3-03-typed-midpoint.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-04 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误定义/公式、跳过 sum[1]=2、漏写或写错 `sum[i] = sum[i - 1] + a[i]`(空提交、全角方括号等号加号、漏减 1 写成 `sum[i]`、漏 `a[i]`、下标错位、方向反成 `sum[i + 1]`、只加相邻两格、把下标 `i` 当数组元素)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-04 E2E`](../tests/e2e/s3-04-manual-checklist.md)、[`tests/s3-04-typed-prefix.test.ts`](../tests/s3-04-typed-prefix.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误含义/移动方式、跳过空窗口、漏写或写错 `right++; sum += a[right];`(空提交、全角加号分号方括号、两步顺序反了、用减号、下标写成 `a[left]`、只移不加、只加不移、移错成 `left++`、用 `=` 覆盖窗口和、方向反成 `right--`)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-05 E2E`](../tests/e2e/s3-05-manual-checklist.md)、[`tests/s3-05-typed-window.test.ts`](../tests/s3-05-typed-window.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误规则/标准、跳过先选书法、漏写或写错 `sort(a + 1, a + 4, by_end)`(空提交、全角括号加号逗号、按开始时间排、按时长排、比较规则名字写错、漏掉第三个参数、起点写成 `a`、终点写成 `a + 3`、起止写反)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-06 E2E`](../tests/e2e/s3-06-manual-checklist.md)、[`tests/s3-06-typed-greedy.test.ts`](../tests/s3-06-typed-greedy.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-07 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误容器/括号用法、跳过空栈、漏写或写错 `st.pop()`(空提交、全角点号圆括号、写成只看不弹的 `st.top()`、只判空的 `st.empty()`、又压一个的 `st.push(...)`、只数个数的 `st.size()`、漏写 `st.`)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-07 E2E`](../tests/e2e/s3-07-manual-checklist.md)、[`tests/s3-07-typed-pop.test.ts`](../tests/s3-07-typed-pop.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误 DP 含义/状态、跳过初值、漏写或写错 `dp[i] = dp[i - 1] + dp[i - 2]`(空提交、全角方括号等号加号、两类走法相乘、`i - 1` 写两次、多写 `+ 1`、右边又用 `dp[i]` 自己、写成 `dp[i + 1]`)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-08 E2E`](../tests/e2e/s3-08-manual-checklist.md)、[`tests/s3-08-typed-transition.test.ts`](../tests/s3-08-typed-transition.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-01 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误程序规范/范围、跳过圈范围和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与把输出写成读入方向 `cin >> n + 1;` 也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-01 E2E`](../tests/e2e/s4-01-manual-checklist.md)、[`tests/s4-01-typed-clean-output.test.ts`](../tests/s4-01-typed-clean-output.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误建模卡/已知未知、跳过写下已知和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与用 `sum = a[i];` 覆盖掉前面的和也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-02 E2E`](../tests/e2e/s4-02-manual-checklist.md)、[`tests/s4-02-typed-accumulate.test.ts`](../tests/s4-02-typed-accumulate.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-03 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误模拟思路/条件分支、跳过写出状态和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与把允许的 0 写成 `if (balance + x > 0)` 也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-03 E2E`](../tests/e2e/s4-03-manual-checklist.md)、[`tests/s4-03-typed-guard.test.ts`](../tests/s4-03-typed-guard.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-04 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误搜索思路/剪枝条件、跳过选择步骤、剪枝那一行的空提交/全角符号/`>= target` 写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-04 E2E`](../tests/e2e/s4-04-manual-checklist.md)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误工具选择/处理思路、跳过排序步骤、计数那一行的空提交/全角符号/`cnt[score] = 1` 覆盖写法写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-05 E2E`](../tests/e2e/s4-05-manual-checklist.md)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误状态定义/处理思路、跳过转移步骤、转移那一行的空提交/全角符号/漏写金额写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-06 E2E`](../tests/e2e/s4-06-manual-checklist.md)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-07 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误图表示/访问标记选择、跳过 DFS 步骤、防止重复访问那一行的空提交/全角符号/条件写反写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-07 E2E`](../tests/e2e/s4-07-manual-checklist.md)、[`tests/s4-07-typed-visited-guard.test.ts`](../tests/s4-07-typed-visited-guard.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误做题顺序/保底方案选择、跳过划分子任务步骤、保底分支那一行的空提交/全角符号/写成子任务 2 上限写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-08 E2E`](../tests/e2e/s4-08-manual-checklist.md)、[`tests/s4-08-typed-fallback.test.ts`](../tests/s4-08-typed-fallback.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-01 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始顺序/跳过样例选择、跳过审题计时步骤和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与范围正好差一格写成 `int a[100000];` 也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-01 E2E`](../tests/e2e/s5-01-manual-checklist.md)、[`tests/s5-01-typed-array-size.test.ts`](../tests/s5-01-typed-array-size.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误乱改/整份重写选择、跳过最小复现步骤、分段输出那一行的空提交/全角符号/写成读入方向 `cin >> i >> prefix;` 和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-02 E2E`](../tests/e2e/s5-02-manual-checklist.md)、[`tests/s5-02-typed-debug-print.test.ts`](../tests/s5-02-typed-debug-print.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-03 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误溢出/越界诊断、跳过定位步骤、累加变量那一行的空提交/全角符号/写成 `int sum = 0;` 装不下和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-03 E2E`](../tests/e2e/s5-03-manual-checklist.md)、[`tests/s5-03-typed-long-long.test.ts`](../tests/s5-03-typed-long-long.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-04 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始策略/伪优化识别、跳过标注步骤、区间和那一行的空提交/全角符号/漏减 1 写成 `sum[r] - sum[l]` 和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-04 E2E`](../tests/e2e/s5-04-manual-checklist.md)、[`tests/s5-04-typed-range-query.test.ts`](../tests/s5-04-typed-range-query.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误提交顺序/自测记录选择、跳过时间检查步骤、空数组那一行的空提交/全角符号/边界判成 `if (n == 1)` 和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-05 E2E`](../tests/e2e/s5-05-manual-checklist.md)、[`tests/s5-05-typed-empty-guard.test.ts`](../tests/s5-05-typed-empty-guard.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始选择/时间不够处理选择、跳过找错步骤、循环范围那一行的空提交/全角符号/漏掉等号写成 `i < n` 和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-06 E2E`](../tests/e2e/s5-06-manual-checklist.md)、[`tests/s5-06-typed-loop-bound.test.ts`](../tests/s5-06-typed-loop-bound.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-07 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始准备/习惯判断选择、跳过交叉检查步骤和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与漏写 `1LL` 让 `n * (n + 1)` 溢出也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-07 E2E`](../tests/e2e/s5-07-manual-checklist.md)、[`tests/s5-07-typed-cross-check.test.ts`](../tests/s5-07-typed-cross-check.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 19 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始整理/薄弱模块标注选择、跳过知识地图步骤和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与把整排清零写成标量 `int cnt[105] = 0;` 也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-08 E2E`](../tests/e2e/s5-08-manual-checklist.md)、[`tests/s5-08-typed-array-init.test.ts`](../tests/s5-08-typed-array-init.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误类型、跳过声明/赋值和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-02 E2E`](../tests/e2e/s1-02-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-03 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误公式、跳过整除/取模和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-03 E2E`](../tests/e2e/s1-03-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-04 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误读入、跳过空格/换行和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-04 E2E`](../tests/e2e/s1-04-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误判断、跳过 90/60 分提问、条件写错(用 > 或单个 =、中文符号、数字写错)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、条件草稿与答题状态;条件检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S1-05 E2E`](../tests/e2e/s1-05-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`tests/s1-05-typed-condition.test.ts`](../tests/s1-05-typed-condition.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-06 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误循环、跳过 i=1/i=2 累加和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-06 E2E`](../tests/e2e/s1-06-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-07 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误内外层、跳过第 1/2 行和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-07 E2E`](../tests/e2e/s1-07-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s1-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误分类、跳过读报错/定位行和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | [`S1-08 E2E`](../tests/e2e/s1-08-manual-checklist.md#自动化复验记录)、[`E2E-s1-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-01 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误存法/下标、跳过 a[0]/a[1]、漏写或写错 `a[n - 1]`(空提交、全角方括号、越界写法)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-01 E2E`](../tests/e2e/s2-01-manual-checklist.md)、[`tests/s2-01-typed-last-index.test.ts`](../tests/s2-01-typed-last-index.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误存法、跳过 s[0]/s[1]、漏写或写错 `s[n - 1]`(空提交、全角方括号、越界写法)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-02 E2E`](../tests/e2e/s2-02-manual-checklist.md)、[`tests/s2-02-typed-last-char.test.ts`](../tests/s2-02-typed-last-char.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-03 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误抽法/返回、跳过调用/参数、漏写或写错 `isEven(4)`(空提交、全角小括号、只写函数名、参数或大小写不符)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-03 E2E`](../tests/e2e/s2-03-manual-checklist.md)、[`tests/s2-03-typed-function-call.test.ts`](../tests/s2-03-typed-function-call.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-04 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误可见范围/值传递、跳过调用/副本、漏写或写错 `int x`(空提交、全角符号、写成 `int &x` 引用或 `int *x` 指针、参数名与函数体对不上)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-04 E2E`](../tests/e2e/s2-04-manual-checklist.md)、[`tests/s2-04-typed-pass-by-value.test.ts`](../tests/s2-04-typed-pass-by-value.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误存法/成员访问、跳过定义/写入、漏写或写错 `a[0].score`(空提交、全角点号或方括号、写成 `->`、取错成员、漏下标或下标写错)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-05 E2E`](../tests/e2e/s2-05-manual-checklist.md)、[`tests/s2-05-typed-member-access.test.ts`](../tests/s2-05-typed-member-access.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误排法/比较规则、跳过 3 和 1 / 3 和 2 交换、漏写或写错 `swap(a[0], a[1])`(空提交、全角括号或逗号、换同一格、跳到不相邻的格、直接赋值或漏括号)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-06 E2E`](../tests/e2e/s2-06-manual-checklist.md)、[`tests/s2-06-typed-swap.test.ts`](../tests/s2-06-typed-swap.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-07 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误范围/状态、跳过 i=1 / i=2、漏写或写错 `if (i % 2 == 0) evenCount++;`(空提交、全角括号百分号分号、只加一不判断、用 `3 / 2` 整除、条件写成 `i % 2 == 1` 或单个 `=`、漏分号、改错变量)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-07 E2E`](../tests/e2e/s2-07-manual-checklist.md)、[`tests/s2-07-typed-enum.test.ts`](../tests/s2-07-typed-enum.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s2-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误估法/次数、跳过单层/双层、漏写或写错 `n * n`(空提交、全角乘号、写成 `n + n`、只写单层 `n`、用 `^` 当乘方、多套一层、写死数字)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;存储失败时说明限制 | [`S2-08 E2E`](../tests/e2e/s2-08-manual-checklist.md)、[`tests/s2-08-typed-complexity.test.ts`](../tests/s2-08-typed-complexity.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-01 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误拆法/停止条件、跳过 125 的中间步、漏写或写错 `x % 10`(空提交、全角百分号、写成 `x / 10` 或 `x % 100`)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-01 E2E`](../tests/e2e/s3-01-manual-checklist.md)、[`tests/s3-01-typed-digit.test.ts`](../tests/s3-01-typed-digit.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误拆法/终止条件、跳过 countdown(2)、漏写或写错 `n * fact(n - 1)`(空提交、全角括号与减号、写成 `n * fact(n)` 到不了边界或 `n * fact(n - 2)` 漏项)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-02 E2E`](../tests/e2e/s3-02-manual-checklist.md)、[`tests/s3-02-typed-recursion.test.ts`](../tests/s3-02-typed-recursion.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-03 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误前提/边界含义、跳过 a[2]=5、漏写或写错 `(left + right) / 2`(空提交、全角括号加号除号、漏括号写成 `left + right / 2`、写成乘 2)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-03 E2E`](../tests/e2e/s3-03-manual-checklist.md)、[`tests/s3-03-typed-midpoint.test.ts`](../tests/s3-03-typed-midpoint.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-04 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误定义/公式、跳过 sum[1]=2、漏写或写错 `sum[i] = sum[i - 1] + a[i]`(空提交、全角方括号等号加号、漏减 1 写成 `sum[i]`、漏 `a[i]`、下标错位、方向反成 `sum[i + 1]`、只加相邻两格、把下标 `i` 当数组元素)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-04 E2E`](../tests/e2e/s3-04-manual-checklist.md)、[`tests/s3-04-typed-prefix.test.ts`](../tests/s3-04-typed-prefix.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误含义/移动方式、跳过空窗口、漏写或写错 `right++; sum += a[right];`(空提交、全角加号分号方括号、两步顺序反了、用减号、下标写成 `a[left]`、只移不加、只加不移、移错成 `left++`、用 `=` 覆盖窗口和、方向反成 `right--`)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-05 E2E`](../tests/e2e/s3-05-manual-checklist.md)、[`tests/s3-05-typed-window.test.ts`](../tests/s3-05-typed-window.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误规则/标准、跳过先选书法、漏写或写错 `sort(a + 1, a + 4, by_end)`(空提交、全角括号加号逗号、按开始时间排、按时长排、比较规则名字写错、漏掉第三个参数、起点写成 `a`、终点写成 `a + 3`、起止写反)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-06 E2E`](../tests/e2e/s3-06-manual-checklist.md)、[`tests/s3-06-typed-greedy.test.ts`](../tests/s3-06-typed-greedy.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-07 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误容器/括号用法、跳过空栈、漏写或写错 `st.pop()`(空提交、全角点号圆括号、写成只看不弹的 `st.top()`、只判空的 `st.empty()`、又压一个的 `st.push(...)`、只数个数的 `st.size()`、漏写 `st.`)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-07 E2E`](../tests/e2e/s3-07-manual-checklist.md)、[`tests/s3-07-typed-pop.test.ts`](../tests/s3-07-typed-pop.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s3-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误 DP 含义/状态、跳过初值、漏写或写错 `dp[i] = dp[i - 1] + dp[i - 2]`(空提交、全角方括号等号加号、两类走法相乘、`i - 1` 写两次、多写 `+ 1`、右边又用 `dp[i]` 自己、写成 `dp[i + 1]`)和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、答题状态与这一空的草稿;检查失败可看提示、参考代码或重写;存储失败时说明限制 | [`S3-08 E2E`](../tests/e2e/s3-08-manual-checklist.md)、[`tests/s3-08-typed-transition.test.ts`](../tests/s3-08-typed-transition.test.ts)、[`E2E-s2-typed`](../tests/e2e/s2-typed-cdp.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-01 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误程序规范/范围、跳过圈范围和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与把输出写成读入方向 `cin >> n + 1;` 也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-01 E2E`](../tests/e2e/s4-01-manual-checklist.md)、[`tests/s4-01-typed-clean-output.test.ts`](../tests/s4-01-typed-clean-output.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误建模卡/已知未知、跳过写下已知和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与用 `sum = a[i];` 覆盖掉前面的和也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-02 E2E`](../tests/e2e/s4-02-manual-checklist.md)、[`tests/s4-02-typed-accumulate.test.ts`](../tests/s4-02-typed-accumulate.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-03 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误模拟思路/条件分支、跳过写出状态和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与把允许的 0 写成 `if (balance + x > 0)` 也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-03 E2E`](../tests/e2e/s4-03-manual-checklist.md)、[`tests/s4-03-typed-guard.test.ts`](../tests/s4-03-typed-guard.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-04 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误搜索思路/剪枝条件、跳过选择步骤、剪枝那一行的空提交/全角符号/`>= target` 写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-04 E2E`](../tests/e2e/s4-04-manual-checklist.md)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误工具选择/处理思路、跳过排序步骤、计数那一行的空提交/全角符号/`cnt[score] = 1` 覆盖写法写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-05 E2E`](../tests/e2e/s4-05-manual-checklist.md)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误状态定义/处理思路、跳过转移步骤、转移那一行的空提交/全角符号/漏写金额写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-06 E2E`](../tests/e2e/s4-06-manual-checklist.md)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-07 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误图表示/访问标记选择、跳过 DFS 步骤、防止重复访问那一行的空提交/全角符号/条件写反写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-07 E2E`](../tests/e2e/s4-07-manual-checklist.md)、[`tests/s4-07-typed-visited-guard.test.ts`](../tests/s4-07-typed-visited-guard.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s4-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误做题顺序/保底方案选择、跳过划分子任务步骤、保底分支那一行的空提交/全角符号/写成子任务 2 上限写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S4-08 E2E`](../tests/e2e/s4-08-manual-checklist.md)、[`tests/s4-08-typed-fallback.test.ts`](../tests/s4-08-typed-fallback.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-01 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始顺序/跳过样例选择、跳过审题计时步骤和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与范围正好差一格写成 `int a[100000];` 也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-01 E2E`](../tests/e2e/s5-01-manual-checklist.md)、[`tests/s5-01-typed-array-size.test.ts`](../tests/s5-01-typed-array-size.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-02 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误乱改/整份重写选择、跳过最小复现步骤、分段输出那一行的空提交/全角符号/写成读入方向 `cin >> i >> prefix;` 和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-02 E2E`](../tests/e2e/s5-02-manual-checklist.md)、[`tests/s5-02-typed-debug-print.test.ts`](../tests/s5-02-typed-debug-print.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-03 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误溢出/越界诊断、跳过定位步骤、累加变量那一行的空提交/全角符号/写成 `int sum = 0;` 装不下和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-03 E2E`](../tests/e2e/s5-03-manual-checklist.md)、[`tests/s5-03-typed-long-long.test.ts`](../tests/s5-03-typed-long-long.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-04 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始策略/伪优化识别、跳过标注步骤、区间和那一行的空提交/全角符号/漏减 1 写成 `sum[r] - sum[l]` 和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-04 E2E`](../tests/e2e/s5-04-manual-checklist.md)、[`tests/s5-04-typed-range-query.test.ts`](../tests/s5-04-typed-range-query.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-05 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误提交顺序/自测记录选择、跳过时间检查步骤、空数组那一行的空提交/全角符号/边界判成 `if (n == 1)` 和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-05 E2E`](../tests/e2e/s5-05-manual-checklist.md)、[`tests/s5-05-typed-empty-guard.test.ts`](../tests/s5-05-typed-empty-guard.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始选择/时间不够处理选择、跳过找错步骤、循环范围那一行的空提交/全角符号/漏掉等号写成 `i < n` 和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-06 E2E`](../tests/e2e/s5-06-manual-checklist.md)、[`tests/s5-06-typed-loop-bound.test.ts`](../tests/s5-06-typed-loop-bound.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-07 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始准备/习惯判断选择、跳过交叉检查步骤和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与漏写 `1LL` 让 `n * (n + 1)` 溢出也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-07 E2E`](../tests/e2e/s5-07-manual-checklist.md)、[`tests/s5-07-typed-cross-check.test.ts`](../tests/s5-07-typed-cross-check.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,`bun run e2e:s5-typed`);整课推进与随机小测已复验(`bun run e2e:flow`,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) | ✅ 错误开始整理/薄弱模块标注选择、跳过知识地图步骤和存储不可用均给出明确反馈;手写填空那一行的空提交、全角符号与把整排清零写成标量 `int cnt[105] = 0;` 也各自被点出且不算完成 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | [`S5-08 E2E`](../tests/e2e/s5-08-manual-checklist.md)、[`tests/s5-08-typed-array-init.test.ts`](../tests/s5-08-typed-array-init.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | | 外部视频课件交付状态 | 低 | 仓库外实现 | 不适用:视频生产和播放不属于本仓库 | 不适用:无账号 | 不适用:本仓库只读关联状态 | 外部交付流程负责;本仓库不得伪造状态 | -| S1-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:s1-01`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-01 E2E`](../tests/e2e/s1-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-02 E2E`](../tests/e2e/s1-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-03 E2E`](../tests/e2e/s1-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-04 E2E`](../tests/e2e/s1-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-05 E2E`](../tests/e2e/s1-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-06 E2E`](../tests/e2e/s1-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-07 E2E`](../tests/e2e/s1-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S1-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-08 E2E`](../tests/e2e/s1-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-01 E2E`](../tests/e2e/s2-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-02 E2E`](../tests/e2e/s2-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-03 E2E`](../tests/e2e/s2-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-04 E2E`](../tests/e2e/s2-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-05 E2E`](../tests/e2e/s2-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-06 E2E`](../tests/e2e/s2-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-07 E2E`](../tests/e2e/s2-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S2-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-08 E2E`](../tests/e2e/s2-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-01 E2E`](../tests/e2e/s3-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-02 E2E`](../tests/e2e/s3-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-03 E2E`](../tests/e2e/s3-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-04 E2E`](../tests/e2e/s3-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-05 E2E`](../tests/e2e/s3-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-06 E2E`](../tests/e2e/s3-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:s1-01`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-01 E2E`](../tests/e2e/s1-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-02 E2E`](../tests/e2e/s1-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-03 E2E`](../tests/e2e/s1-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-04 E2E`](../tests/e2e/s1-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-05 E2E`](../tests/e2e/s1-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-06 E2E`](../tests/e2e/s1-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-07 E2E`](../tests/e2e/s1-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S1-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S1-08 E2E`](../tests/e2e/s1-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-01 E2E`](../tests/e2e/s2-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-02 E2E`](../tests/e2e/s2-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-03 E2E`](../tests/e2e/s2-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-04 E2E`](../tests/e2e/s2-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-05 E2E`](../tests/e2e/s2-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-06 E2E`](../tests/e2e/s2-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-07 E2E`](../tests/e2e/s2-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S2-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S2-08 E2E`](../tests/e2e/s2-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-01 E2E`](../tests/e2e/s3-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-02 E2E`](../tests/e2e/s3-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-03 E2E`](../tests/e2e/s3-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-04 E2E`](../tests/e2e/s3-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-05 E2E`](../tests/e2e/s3-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-06 E2E`](../tests/e2e/s3-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | | 初学者常见问题词条 | 低 | ✅ | ✅ 词条缺失、目录载入失败、返回 HTTP 错误或词条面板脚本本身未载入时明确说明,且不中断课件其他互动 | 不适用:无账号 | ✅ 失败时保留“重新载入词条表”入口,恢复后回到学习者刚才点开的词条,不把失败写成已载入;面板脚本 404 时改用“重新载入本课”入口且不假装修好 | [`tests/faq.test.ts`](../tests/faq.test.ts)、[`tests/faq-panel-recovery.test.ts`](../tests/faq-panel-recovery.test.ts)、[`tests/faq-panel-fallback.test.ts`](../tests/faq-panel-fallback.test.ts)、[`E2E-07`](../tests/e2e/manual-checklist.md#e2e-07-词条载入失败与恢复)、[`S1-01 E2E-08`](../tests/e2e/s1-01-manual-checklist.md#e2e-s1-01-08-词条面板脚本没载入成功)、[`S1-01 E2E`](../tests/e2e/s1-01-manual-checklist.md#e2e-s1-01-04常见问题解惑)、[`S1-02 E2E`](../tests/e2e/s1-02-manual-checklist.md#e2e-s1-02-04常见问题解惑)、[`S1-03 E2E`](../tests/e2e/s1-03-manual-checklist.md#e2e-s1-03-04常见问题解惑)、[`S1-04 E2E`](../tests/e2e/s1-04-manual-checklist.md#e2e-s1-04-04常见问题解惑)、[`S1-05 E2E`](../tests/e2e/s1-05-manual-checklist.md#e2e-s1-05-05常见问题解惑)、[`S1-06 E2E`](../tests/e2e/s1-06-manual-checklist.md#e2e-s1-06-04常见问题解惑)、[`S1-07 E2E`](../tests/e2e/s1-07-manual-checklist.md#e2e-s1-07-04常见问题解惑)、[`S1-08 E2E`](../tests/e2e/s1-08-manual-checklist.md#e2e-s1-08-04常见问题解惑)、[`S2-01 E2E`](../tests/e2e/s2-01-manual-checklist.md#e2e-s2-01-04常见问题解惑)、[`S2-02 E2E`](../tests/e2e/s2-02-manual-checklist.md#e2e-s2-02-04常见问题解惑)、[`S2-03 E2E`](../tests/e2e/s2-03-manual-checklist.md#e2e-s2-03-04常见问题解惑)、[`S2-04 E2E`](../tests/e2e/s2-04-manual-checklist.md#e2e-s2-04-04常见问题解惑)、[`S2-05 E2E`](../tests/e2e/s2-05-manual-checklist.md#e2e-s2-05-04常见问题解惑)、[`S2-06 E2E`](../tests/e2e/s2-06-manual-checklist.md#e2e-s2-06-04常见问题解惑)、[`S2-07 E2E`](../tests/e2e/s2-07-manual-checklist.md#e2e-s2-07-04常见问题解惑)、[`S2-08 E2E`](../tests/e2e/s2-08-manual-checklist.md#e2e-s2-08-04常见问题解惑)、[`S3-01 E2E`](../tests/e2e/s3-01-manual-checklist.md#e2e-s3-01-04常见问题解惑)、[`S3-02 E2E`](../tests/e2e/s3-02-manual-checklist.md#e2e-s3-02-04常见问题解惑)、[`S3-03 E2E`](../tests/e2e/s3-03-manual-checklist.md#e2e-s3-03-04常见问题解惑)、[`S3-04 E2E`](../tests/e2e/s3-04-manual-checklist.md#e2e-s3-04-04常见问题解惑)、[`S3-05 E2E`](../tests/e2e/s3-05-manual-checklist.md#e2e-s3-05-04常见问题解惑)、[`S3-06 E2E`](../tests/e2e/s3-06-manual-checklist.md#e2e-s3-06-04常见问题解惑)、[`S3-07 E2E`](../tests/e2e/s3-07-manual-checklist.md#e2e-s3-07-04常见问题解惑)、[`S3-08 E2E`](../tests/e2e/s3-08-manual-checklist.md#e2e-s3-08-04常见问题解惑)、[`S4-01 E2E`](../tests/e2e/s4-01-manual-checklist.md#e2e-s4-01-04常见问题解惑)、[`S4-02 E2E`](../tests/e2e/s4-02-manual-checklist.md#e2e-s4-02-04常见问题解惑)、[`S4-03 E2E`](../tests/e2e/s4-03-manual-checklist.md#e2e-s4-03-04常见问题解惑)、[`S4-04 E2E`](../tests/e2e/s4-04-manual-checklist.md#e2e-s4-04-04常见问题解惑)、[`S4-05 E2E`](../tests/e2e/s4-05-manual-checklist.md#e2e-s4-05-04常见问题解惑)、[`S4-06 E2E`](../tests/e2e/s4-06-manual-checklist.md#e2e-s4-06-04常见问题解惑)、[`S4-07 E2E`](../tests/e2e/s4-07-manual-checklist.md#e2e-s4-07-04常见问题解惑)、[`S4-08 E2E`](../tests/e2e/s4-08-manual-checklist.md#e2e-s4-08-04常见问题解惑)、[`S5-01 E2E`](../tests/e2e/s5-01-manual-checklist.md#e2e-s5-01-04常见问题解惑)、[`S5-02 E2E`](../tests/e2e/s5-02-manual-checklist.md#e2e-s5-02-04常见问题解惑)、[`S5-03 E2E`](../tests/e2e/s5-03-manual-checklist.md#e2e-s5-03-04常见问题解惑)、[`S5-04 E2E`](../tests/e2e/s5-04-manual-checklist.md#e2e-s5-04-04常见问题解惑)、[`S5-05 E2E`](../tests/e2e/s5-05-manual-checklist.md#e2e-s5-05-04常见问题解惑)、[`S5-06 E2E`](../tests/e2e/s5-06-manual-checklist.md#e2e-s5-06-04常见问题解惑)、[`S5-07 E2E`](../tests/e2e/s5-07-manual-checklist.md#e2e-s5-07-04常见问题解惑)、[`S5-08 E2E`](../tests/e2e/s5-08-manual-checklist.md#e2e-s5-08-04常见问题解惑) | -| S3-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-07 E2E`](../tests/e2e/s3-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S3-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-08 E2E`](../tests/e2e/s3-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-01 E2E`](../tests/e2e/s4-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-02 E2E`](../tests/e2e/s4-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-03 E2E`](../tests/e2e/s4-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-04 E2E`](../tests/e2e/s4-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-05 E2E`](../tests/e2e/s4-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-06 E2E`](../tests/e2e/s4-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-07 E2E`](../tests/e2e/s4-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S4-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-08 E2E`](../tests/e2e/s4-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-01 E2E`](../tests/e2e/s5-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-02 E2E`](../tests/e2e/s5-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-03 E2E`](../tests/e2e/s5-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-04 E2E`](../tests/e2e/s5-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-05 E2E`](../tests/e2e/s5-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-06 E2E`](../tests/e2e/s5-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-07 E2E`](../tests/e2e/s5-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | -| S5-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题并指回本节讲解;空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-08 E2E`](../tests/e2e/s5-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-07 E2E`](../tests/e2e/s3-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S3-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S3-08 E2E`](../tests/e2e/s3-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-01 E2E`](../tests/e2e/s4-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-02 E2E`](../tests/e2e/s4-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-03 E2E`](../tests/e2e/s4-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-04 E2E`](../tests/e2e/s4-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-05 E2E`](../tests/e2e/s4-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-06 E2E`](../tests/e2e/s4-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-07 E2E`](../tests/e2e/s4-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S4-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S4-08 E2E`](../tests/e2e/s4-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-01 E2E`](../tests/e2e/s5-01-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-02 E2E`](../tests/e2e/s5-02-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-03 E2E`](../tests/e2e/s5-03-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-04 E2E`](../tests/e2e/s5-04-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-05 E2E`](../tests/e2e/s5-05-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-06 E2E`](../tests/e2e/s5-06-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-07 E2E`](../tests/e2e/s5-07-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | +| S5-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(`bun run e2e:flow`,2026-09-21 Chrome 153 无头) | ✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | [`S5-08 E2E`](../tests/e2e/s5-08-manual-checklist.md)、[`tests/lesson-directories.test.ts`](../tests/lesson-directories.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts) | | 题库内容机器校验与证据留痕 | 中 | ✅ 40 课 215 道题逐题独立盲解(只给题干与选项、不给标注答案),打乱选项顺序后整批重解一遍,与课件答案逐题比对全部一致;涉及算术与语言行为的判断用本机 g++ 实测;证据与题目内容哈希绑定写入 [`docs/review/question-verification.json`](../docs/review/question-verification.json),页面文案与 `lesson.json` 同步为「已通过校验 / `machine-checked`」 | ✅ 改了题干、选项顺序或答案而不重新校验,证据哈希对不上会当场失败;答案位置重新集中到同一个选项、证据里出现不一致结论、或页面宣称「人工审校 / 已审校」也会当场失败 | 不适用:无账号 | ✅ 证据作废即失败,必须重新盲解并更新证据文件;题库改动与证据更新必须同一次提交 | [`tests/question-verification.test.ts`](../tests/question-verification.test.ts)、[`docs/review/question-verification.json`](../docs/review/question-verification.json)、[`tests/lesson-contract.test.ts`](../tests/lesson-contract.test.ts) | | 题库与答案解析维护 | 中 | ✅ 40 课题库逐题校验课程 ID、目标、难度档位、题型、答案索引、解析与来源;组卷侧另验题数、同次不重复、只出选择题、种子可复现与题库不被就地改写;每题还用 `objectiveIndex` 绑到本课学习目标条目 | ✅ 空题库、答案越界、题型不符、缺少题干、来源不明或在抽题时改写题库都会当场失败;题目目标越界、题库题数与 `lesson.json` 不符也会当场失败 | 不适用:无账号 | 不适用:静态校验不修改已发布题库 | [`tests/lesson-contract.test.ts`](../tests/lesson-contract.test.ts)、[`tests/quiz-paper-contract.test.ts`](../tests/quiz-paper-contract.test.ts)、[`tests/objective-binding.test.ts`](../tests/objective-binding.test.ts) | -| 题库检查目标与课程学习目标绑定 | 中 | ✅ 40 课 215 道题逐题带 `objectiveIndex`,讲义页渲染的「检查目标」就是本课学习目标原文,另起一行给出更细的「本题检查」,且 40 课的三条学习目标都有题目覆盖;`bun run e2e:s1-01`(88 项)、`bun run e2e:typed`(39 课共 659 项)与 `bun run e2e:flow`(39 课共 741 项)在真实浏览器复验 | ✅ 目标越界、讲义目标副本与 `courseData` 漂移、题库题数与元数据不符、`docs/feature-checklist.md` 写的题库题数与现场不符、未通过的试卷说不出错题落在哪条目标、文档把未覆盖的学习目标点名成已被覆盖的那条,都会当场失败 | 不适用:无账号 | 不适用:静态校验不修改已发布题库 | [`tests/objective-binding.test.ts`](../tests/objective-binding.test.ts)、[`tests/quiz-facts-prose.test.ts`](../tests/quiz-facts-prose.test.ts)、[`S1-01 E2E`](../tests/e2e/s1-01-manual-checklist.md#自动化复验记录)、[`tests/e2e/s2-typed-cdp.ts`](../tests/e2e/s2-typed-cdp.ts) | -| 课后继续学习入口 | 中 | ✅ 39 节非末课走完 `N / N` 后自己打开 `#nextStep`,写明下一课是 `Sx-xx` 与课名、先练的那件事,链接直达下一课的 `index.html` 且真的可达;S5-08 作为最后一课换成课程收尾出口并指回课程路线。真实浏览器复验见 `bun run e2e:flow`(2026-09-21 Chrome 153 无头,每课 19 项) | ✅ 没做完之前入口是隐藏的,不会把还在这一课上的学习者提前引走;边界/失败路径另由 `tests/next-lesson.test.ts` 逐课看住:入口在「视频边界」说明之前、一页出现两个入口、链接指向 `../sX-XX/`(大写或大写目录名)、指向不存在的下一课、标题或先练目标与 `courseData` 漂移、末课仍留指向不存在的下一课、或出现成绩评定/证书/保过之类的说法,都会当场失败 | 不适用:无账号 | ✅ 清掉本地存储后入口重新隐藏、页面回到 `0 / N`,不依赖任何服务端状态;下一课链接用的是相对路径,开发服务器与静态托管下都成立 | [`tests/next-lesson.test.ts`](../tests/next-lesson.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts)、[`flow 清单`](../tests/e2e/flow-manual-checklist.md#e2e-flow-05-课后继续学习入口) | +| 题库检查目标与课程学习目标绑定 | 中 | ✅ 40 课 215 道题逐题带 `objectiveIndex`,讲义页渲染的「检查目标」就是本课学习目标原文,另起一行给出更细的「本题检查」,且 40 课的三条学习目标都有题目覆盖;`bun run e2e:s1-01`(88 项)、`bun run e2e:typed`(39 课共 659 项)与 `bun run e2e:flow`(39 课共 780 项)在真实浏览器复验 | ✅ 目标越界、讲义目标副本与 `courseData` 漂移、题库题数与元数据不符、`docs/feature-checklist.md` 写的题库题数与现场不符、未通过的试卷说不出错题落在哪条目标、文档把未覆盖的学习目标点名成已被覆盖的那条,都会当场失败 | 不适用:无账号 | 不适用:静态校验不修改已发布题库 | [`tests/objective-binding.test.ts`](../tests/objective-binding.test.ts)、[`tests/quiz-facts-prose.test.ts`](../tests/quiz-facts-prose.test.ts)、[`S1-01 E2E`](../tests/e2e/s1-01-manual-checklist.md#自动化复验记录)、[`tests/e2e/s2-typed-cdp.ts`](../tests/e2e/s2-typed-cdp.ts) | +| 课后继续学习入口 | 中 | ✅ 39 节非末课走完 `N / N` 后自己打开 `#nextStep`,写明下一课是 `Sx-xx` 与课名、先练的那件事,链接直达下一课的 `index.html` 且真的可达;S5-08 作为最后一课换成课程收尾出口并指回课程路线。真实浏览器复验见 `bun run e2e:flow`(2026-09-21 Chrome 153 无头,每课 20 项) | ✅ 没做完之前入口是隐藏的,不会把还在这一课上的学习者提前引走;边界/失败路径另由 `tests/next-lesson.test.ts` 逐课看住:入口在「视频边界」说明之前、一页出现两个入口、链接指向 `../sX-XX/`(大写或大写目录名)、指向不存在的下一课、标题或先练目标与 `courseData` 漂移、末课仍留指向不存在的下一课、或出现成绩评定/证书/保过之类的说法,都会当场失败 | 不适用:无账号 | ✅ 清掉本地存储后入口重新隐藏、页面回到 `0 / N`,不依赖任何服务端状态;下一课链接用的是相对路径,开发服务器与静态托管下都成立 | [`tests/next-lesson.test.ts`](../tests/next-lesson.test.ts)、[`E2E-flow`](../tests/e2e/flow-cdp.ts)、[`flow 清单`](../tests/e2e/flow-manual-checklist.md#e2e-flow-05-课后继续学习入口) | | 静态站点构建与发布 | 中 | ✅ `bun run build` 从仓库内容重建 `dist/`(40 节课页面 + 课程目录 + 词条面板),`bun run deploy` 先构建再发布到 `cplus.talkincode.net`;2026-09-21 发布后 40 节课地址全部返回 200、`/lessons/s5-08/` 可达、词条面板可载入,线上页面与本地构建逐字节一致(只有 Cloudflare 注入的脚本不同),并用 `CSP_E2E_ORIGIN=https://cplus.talkincode.net` 把真实浏览器复验直接打在线上:`e2e:typed` 的 s5-08 + s3-01 两课 34 项通过,`e2e:flow` 的 s5-07 + s5-08 两课 38 项通过 | ✅ 产物缺课、`dist/` 里残留上一次的旧页面、课程地址的末尾斜杠跳转(`html_handling`)或中文 404 丢失、部署目标(Worker 名 / `dist` 目录 / 域名)与文档漂移,都会由 [`tests/deploy-assets.test.ts`](../tests/deploy-assets.test.ts) 当场失败 | 不适用:无账号 | ✅ 构建每次清空重建 `dist/`,重复发布幂等;线上出错可用 `bunx wrangler rollback` 退回上一个版本;main 上的推送由 [`.github/workflows/test-and-deploy.yml`](../.github/workflows/test-and-deploy.yml) 自动发布(`bun test` 通过才发布,发布后抽检线上) | [`tests/deploy-assets.test.ts`](../tests/deploy-assets.test.ts)、[`tests/ci-workflow.test.ts`](../tests/ci-workflow.test.ts)、[`scripts/build.ts`](../scripts/build.ts)、[`src/index.ts`](../src/index.ts)、[`wrangler.jsonc`](../wrangler.jsonc)、[`.github/workflows/test-and-deploy.yml`](../.github/workflows/test-and-deploy.yml) | | 本地开发服务器内容边界 | 中 | ✅ `bun run dev` 能打开站点内容:首页、课程页(含 `/lessons/s5-08/index.html` 这种直指文件的地址)、词条表与词条面板都返回 200 且带 UTF-8 类型头;少了末尾斜杠的目录地址与线上一致 307 跳到带斜杠的地址 | ✅ 站点之外的地址一律中文 404:`/.git/config`、`/.gitignore`、`/AGENTS.md`、`/README.md`、`/package.json`、`/wrangler.jsonc`、`/docs/`、`/scripts/`、`/src/`、`/tests/`、`/node_modules/`、`/.env`、`/.dev.vars`;越界与编码写法(`..`、`%2e%2e`、`%2f`、`%00`、坏掉的 `%`、`//`、`.` 开头段、不带前导斜杠)都被挡在内容边界之外;`PORT` 非整数或越界、`HOST` 为空、端口被占用都会当场失败并说清怎么办,不静默换端口 | 不适用:无账号 | ✅ 只监听 `127.0.0.1`,不再把仓库连同 `.git` 暴露给同局域网;换端口或换监听地址用 `PORT=4199` / `HOST=127.0.0.1`,直接重启即可,不写任何持久状态 | [`tests/dev-server.test.ts`](../tests/dev-server.test.ts)、[`scripts/dev.ts`](../scripts/dev.ts)、[`src/site.ts`](../src/site.ts) | diff --git a/lessons/s1-01/index.html b/lessons/s1-01/index.html index 8b285eb..1876e14 100644 --- a/lessons/s1-01/index.html +++ b/lessons/s1-01/index.html @@ -920,6 +920,57 @@ color: #91501a; } + .quiz-review-exit { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 9px; + margin: 16px 0 0; + padding: 12px 14px; + background: rgba(215, 230, 205, 0.5); + border-left: 4px solid var(--forest-fog); + border-radius: 12px; + } + + .quiz-review-exit[hidden] { + display: none; + } + + .quiz-review-exit p { + margin: 0; + color: var(--ink); + font-size: 0.79rem; + font-weight: 700; + } + + .review-link { + padding: 7px 12px; + color: var(--forest); + background: var(--paper-bright); + border: 2px solid var(--forest-fog); + border-radius: 999px; + font: inherit; + font-size: 0.78rem; + font-weight: 800; + cursor: pointer; + } + + .review-link:hover { + background: var(--mint); + } + + .review-link:focus-visible { + outline: 3px solid var(--orange); + outline-offset: 3px; + } + + /* 复习出口是程序化聚焦到任务标题上的::focus-visible 在脚本聚焦时不一定命中, + 用 :focus 保证这一下也有看得见的落点。 */ + .step-panel h2:focus { + outline: 3px solid var(--orange-soft); + outline-offset: 4px; + } + .external-boundary { max-width: 790px; margin: 34px 0 0; @@ -1288,7 +1339,7 @@

任务路线

-

任务 1:先找到程序的“开门钥匙”

+

任务 1:先找到程序的“开门钥匙”

你看到的每一行都有用,但程序真正从 开始执行。先点击按钮,把入口这一行点亮。遇到不认识的词,点它或点右上角“常见问题”。

@@ -1321,7 +1372,7 @@

任务 1:先找到程序的“开门钥匙”

+