本项目把“信息学长期递进学习”落到一套面向零基础学习者的 C++ 在线课程中,目标为 CSP-J 入门到提高。当前静态页面用于确认五阶段、40 节课程的规划;40 节课程均已拥有自己的互动学习界面和随机在线测试(题库与解析已通过机器校验,证据见 docs/review/question-verification.json)。视频课件由仓库外流程制作,本仓库只负责代码功能与课程事实对齐。
学习者
|
v
当前课程路线原型(index.html)
|-- 五阶段 / 40 课的课程数据
|-- 目标、内容、检验清单、练习建议
`-- 浏览器本地进度(localStorage)
单课在线学习单元(40 课已实现)
|-- 本课互动学习界面
`-- 本课随机在线测试(选择题为主、含解析)
仓库外的视频课件交付
`-- 与课程 ID 对齐的视频、章节与文字稿
内容维护者
|-- docs/course-plan.md
|-- docs/feature-checklist.md
`-- AGENTS.md 内容与验收规约
完成后的课程应像一份由竞赛教练持续维护的训练工作台:初学者能在任意一节课迅速知道“为什么学、这一节具体学什么、做成什么才算会”,然后在同一课程单元中完成互动学习和自测,而不是被概念或题库淹没。五阶段路线提供稳定的长期方向;每一课都可以独立用于课堂讲授、自学和仓库外视频制作。
价值优先级是:概念正确与年龄友好 高于内容炫技,可验证的掌握 高于完成视频数量,题目与解析质量 高于随机性的表面新鲜感,低门槛与长期可维护 高于复杂平台功能。课程要始终诚实标注 CSP-J 的边界:不能以“竞赛”之名承诺保奖、保过或提前灌输不适合初学者的高级内容。
- 五阶段课程导航:
index.html已提供第一阶段至第五阶段的切换、筛选和 40 节课浏览。 - 单课件学习面板:
index.html的课件详情会显示每节课的学习目标、具体内容、检验清单、视频组织建议和练习建议。 - 每节课的先修关系:每课
lessons/<课程-id>/index.html的标题正下方列出要先会的课号、课名与该课要会的那一件事,并给上一课入口;第一课说明「不用先修」且不列任何链接,课程目录的详情面板显示同一份数据,页面上写的与courseData不一致会被校验当场挡下。 - 本地学习进度:课件逐项检验结果保存在浏览器
localStorage;不可用时显示明确提示并继续允许当前会话学习。保存失败发生在会话中途(例如配额用尽)时会立刻可见、可重试,恢复后说明数据状态并补写待保存的进度。 - 即时交互反馈:阶段、课件、筛选和进度操作均会显示明确状态提示,避免用户把页面更新误认为无响应。
- Bun 开发工具链:
bun run dev提供本地静态课程路由,bun run scaffold:lessons创建课程目录,bun test执行无依赖校验。 - 课程目录与状态元数据:
lessons/s1-01/至lessons/s5-08/已建立,均有可机读的lesson.json;视频状态明确为仓库外实现。 - 首节引导式在线课件:
lessons/s1-01/index.html已实现程序入口识别、源文件到运行的概念流程、分号排错(先选最小修复,再亲手补 1 个分号)、可见反馈、可选音效和奖励特效。 - S1-02 引导式在线课件:
lessons/s1-02/index.html已实现类型选择、变量声明/赋值/更新演示、亲手写 1 行更新语句、char 与大整数分界、可见反馈和本地进度恢复。 - S1-03 引导式在线课件:
lessons/s1-03/index.html已实现周长/平均数公式选择、亲手写平均数算式、整除与取模演示、括号消歧义、可见反馈和本地进度恢复。 - S1-04 引导式在线课件:
lessons/s1-04/index.html已实现连续 cin 读入选择、亲手写 1 行读入语句、空格/换行演示、竞赛提示语对照、可见反馈和本地进度恢复。 - S1-05 引导式在线课件:
lessons/s1-05/index.html已实现 if/三路判断选择、60 分边界演示、= 与 == 对照,以及亲手补齐两行条件(只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S1-06 引导式在线课件:
lessons/s1-06/index.html已实现 for/while 选择、亲手写 for 表头、1 到 3 累加演示、忘记 i++ 的死循环对照、可见反馈和本地进度恢复。 - S1-07 引导式在线课件:
lessons/s1-07/index.html已实现内外层职责选择、亲手写内层循环、3 行 3 列图案演示、break 与 continue 对照、可见反馈和本地进度恢复。 - S1-08 引导式在线课件:
lessons/s1-08/index.html已实现三类错误对照、少分号定位、亲手补分号、最小数据与分段输出、可见反馈和本地进度恢复。 - S2-01 引导式在线课件:
lessons/s2-01/index.html已实现数组声明选择、下标 0 到 n-1 演示、亲手写a[n - 1](越界与全角符号都被指正,只做文字规则检查,不编译或执行学习者写的 C++)、越界对照、遍历求最大、可见反馈和本地进度恢复。 - S2-02 引导式在线课件:
lessons/s2-02/index.html已实现 char/string 选择、s[0] 到 s[n-1] 演示、亲手写s[n - 1](越界与全角符号都被指正,只做文字规则检查)、字符统计与数字判断、可见反馈和本地进度恢复。 - S2-03 引导式在线课件:
lessons/s2-03/index.html已实现偶数函数选择、调用/参数/返回值演示、亲手写isEven(4)(漏括号、大小写和参数不符都被指正,只做文字规则检查)、闰年抽取、可见反馈和本地进度恢复。 - S2-04 引导式在线课件:
lessons/s2-04/index.html已实现局部变量可见范围选择、值传递 n 不变演示、亲手写int x(写出引用int &x或指针int *x都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、同名与引用对照、可见反馈和本地进度恢复。 - S2-05 引导式在线课件:
lessons/s2-05/index.html已实现结构体记录卡选择、成员写入/读出演示、亲手写a[0].score(写成->、取错成员或漏下标都会被点出原因,只做文字规则检查)、结构体数组与按字段比较、可见反馈和本地进度恢复。 - S2-06 引导式在线课件:
lessons/s2-06/index.html已实现冒泡思想选择、3/1/2 相邻交换演示、亲手写swap(a[0], a[1])(换同一格、跳到不相邻的格或直接赋值都会被点出原因,只做文字规则检查)、sort 与稳定性对照、可见反馈和本地进度恢复。 - S2-07 引导式在线课件:
lessons/s2-07/index.html已实现枚举范围选择、1 到 3 数偶数的状态演示、亲手写if (i % 2 == 0) evenCount++;(只加一不判断会被点出“漏分支”,用3 / 2整除、写成i % 2 == 1或单个=、漏分号、改错变量都会说明原因,只做文字规则检查)、漏分支对照、可见反馈和本地进度恢复。 - S2-08 引导式在线课件:
lessons/s2-08/index.html已实现操作次数选择、n=3 单层/双层对照、亲手写n * n(写成n + n、只写单层n、用^当乘方、多套一层或写死数字都会被点出原因,只做文字规则检查)、大 n 写法与测试点、可见反馈和本地进度恢复。 - S3-01 引导式在线课件:
lessons/s3-01/index.html已实现数位拆法选择、125 逐步拆位、亲手写x % 10(写成x / 10只去掉个位、x % 100取到两位、x % 2只能分奇偶或全角百分号都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、GCD 与循环停止对照、可见反馈和本地进度恢复。 - S3-02 引导式在线课件:
lessons/s3-02/index.html已实现递归拆法选择、countdown(3) 三层追踪、亲手写n * fact(n - 1)(括号里还是 n 到不了边界、写n - 2会漏一层、只留下更小问题忘了乘当前层都会被点出原因,只做文字规则检查)、阶乘与无限递归对照、可见反馈和本地进度恢复。 - S3-03 引导式在线课件:
lessons/s3-03/index.html已实现有序/单调前提选择、[1,3,5,7,9] 找 7 的区间收缩、亲手写(left + right) / 2(漏括号会先算right / 2导致中点偏移、写成乘 2 会跑出区间都会被点出原因,安全写法left + (right - left) / 2会被标为拓展,只做文字规则检查)、首尾与死循环对照、可见反馈和本地进度恢复。 - 全课程在线学习契约校验:
tests/lesson-contract.test.ts从courseData派生全部 40 节课,逐课校验互动页与随机小测的共同契约——题库来源与难度档位(必会required/ 建议掌握recommended/ 拓展stretch)、选择题占比、空题库与无效题目提示、已通过校验的标记、词条双向接线、本地进度键与“无视频资产”边界。新增课节时无需手写用例即可被覆盖。 - 微编程输入框契约校验:
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(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 道;同次无重复,提交后显示得分与解析;空题库或题目无效时明确告知并保留进度。
- S1-02 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析;空题库或题目无效时明确告知并保留进度。题库来源为本课 course-plan / 自编。
- S1-03 随机选择题小测:从 6 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S1-04 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S1-05 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S1-06 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S1-07 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S1-08 随机选择题小测:从 6 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S2-01 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S2-02 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S2-03 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S2-04 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S2-05 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S2-06 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S2-07 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S2-08 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S3-01 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S3-02 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S3-03 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S3-04 引导式在线课件:
lessons/s3-04/index.html已实现前缀和定义选择、[2,5,1,4] 填表、亲手写sum[i] = sum[i - 1] + a[i](漏减 1 写成sum[i]会退化成原数组、少加a[i]、下标错位到a[i - 1]、方向反成sum[i + 1]、把下标i当数组元素都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、区间公式与 l=1/下标偏移对照、可见反馈和本地进度恢复。 - S3-04 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S3-05 引导式在线课件:
lessons/s3-05/index.html已实现双指针含义选择、[1,2,3] 窗口扩张、亲手写right++; sum += a[right];(两步顺序反了会漏掉新纳入的数、用减号、下标写成a[left]、只移不加、只加不移、移错成left++、用=覆盖窗口和、方向反成right--都会被点出原因,只做文字规则检查)、空/满窗口与移动时机对照、可见反馈和本地进度恢复。 - S3-05 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S3-06 引导式在线课件:
lessons/s3-06/index.html已实现贪心规则选择、三个活动逐步选取、亲手写sort(a + 1, a + 4, by_end)(按开始时间排、按时长排会各给出一个只能选 1 个的反例,比较规则名字写错、漏掉第三个参数、起点写成a把a[0]排进去、终点写成a + 3少排一个、起止写反都会被点出原因,只做文字规则检查)、空选择与时长最长反例对照、可见反馈和本地进度恢复。 - S3-06 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S3-07 引导式在线课件:
lessons/s3-07/index.html已实现栈/队列选择、([]) 入栈出栈、空栈与 ([)] 错配对照,并在只读脚手架里亲手写出一行st.pop();(写成只看一眼的st.top()、st.empty()、又压一个进去的st.push()、只数数的st.size()或漏掉前面的栈名都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S3-07 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S3-08 引导式在线课件:
lessons/s3-08/index.html已实现动态规划含义选择、爬楼梯前三步手算、初值与 n=1 对照,并在只读脚手架里亲手写出一行dp[i] = dp[i - 1] + dp[i - 2];(写成dp[i + 1]、等号右边又出现还没算出来的dp[i]、把两类走法相乘、i - 1用了两次或忘了加dp[i - 2]都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S3-08 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S4-01 引导式在线课件:
lessons/s4-01/index.html已实现竞赛程序规范选择、圈范围/删提示语/对样例三步、干净输出对照,并在只读脚手架里亲手写出一行cout << n + 1;(写成cin >>、丢掉半角分号、把算式写成字符串都会被点出原因)、可见反馈和本地进度恢复。 - S4-01 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S4-02 引导式在线课件:
lessons/s4-02/index.html已实现建模卡含义选择、已知/目标/样例反推三步、算法候选与两个边界对照,并在只读脚手架里亲手写出累加那一行sum += a[i];(写成sum = a[i];会覆盖掉前面的和、把下标写成i之外或漏半角分号都会被点出原因)、可见反馈和本地进度恢复。 - S4-02 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S4-03 引导式在线课件:
lessons/s4-03/index.html已实现模拟思路与条件分支含义选择、状态/事件顺序/样例追踪三步、处理思路与两个边界对照,并在只读脚手架里亲手写出判断那一行if (balance + x >= 0)(把允许的 0 写成> 0、方向写反、漏掉x或漏半角小括号都会被点出原因)、可见反馈和本地进度恢复。 - S4-03 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S4-04 引导式在线课件:
lessons/s4-04/index.html已实现搜索思路与剪枝含义选择、选择/剪枝/回溯三步、处理思路与两个边界对照,并在只读脚手架里亲手写出一行if (sum > target) return;(把边界写成>=、写成!=或<、用只能跳出循环的break、把已经加过的a[i]再加一次或拿个数n当比较对象都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S4-04 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S4-05 引导式在线课件:
lessons/s4-05/index.html已实现计数数组与排序工具选择、排序/扫描/记录三步、处理思路与两个边界对照,并在只读脚手架里亲手写出一行cnt[score]++;(用=把前面数好的次数覆盖掉、加的是分数自己或循环变量i、漏掉方括号里的下标、又读一次输入都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S4-05 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S4-06 引导式在线课件:
lessons/s4-06/index.html已实现状态定义(选或不选)与枚举对照选择、状态/初始化/转移三步、处理思路与两个边界对照,并在只读脚手架里亲手写出一行dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);(两边都用i - 1等于允许相邻两家都被选走、用到还没算出来的dp[i + 1]或越界的nums[i + 1]、漏掉金额nums[i]、漏掉“不选 i”那一路都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S4-06 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S4-07 引导式在线课件:
lessons/s4-07/index.html已实现图的表示(邻接表)与访问标记对照选择、邻接表/访问标记/DFS 三步数连通块、DFS 与 BFS 顺序差异与两个边界对照,并在只读脚手架里亲手写出一行if (visited[u]) return;(把比较对象写反、写成return 0;、用只能跳出循环的break;、去判断邻接表adj[u]或邻居个数deg[u]、下标写成i都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S4-07 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S4-08 引导式在线课件:
lessons/s4-08/index.html已实现做题顺序与保底方案对照选择、划分子任务/保底方案/优化冲刺三步、先易后难顺序与检查时间安排两个边界对照,并在只读脚手架里亲手写出一行if (n <= 1000) { cout << brute(n); return 0; }(不等号方向写反、少写等号把边界那一组排掉、把 1000 写成 100、用要反复做的while判范围都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S4-08 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S5-01 引导式在线课件:
lessons/s5-01/index.html已实现审题计时与不跳过样例对照选择、审题/草稿/对照样例三步、预留检查时间与样例态度两个边界对照,并在只读脚手架里亲手写出一行int a[100005];(拿变量n当数组大小、漏掉元素类型int或末尾半角分号都会被点出原因,开得比范围更宽是允许的、会被说明,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S5-01 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S5-02 引导式在线课件:
lessons/s5-02/index.html已实现最小复现与分段输出对照选择、缩小/分段输出/回归三步、断言思路与回归测试两个边界对照、可见反馈和本地进度恢复。任务 2 之后留一空让学习者亲手写循环里的分段输出cout << i << " " << prefix;——写成分段输出以外的读入方向、只打其中一个值、变量名加引号、全角符号或漏分号都会被点出原因,只做文字规则检查,不在浏览器里运行 C++。 - S5-02 随机选择题小测:从 5 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S5-03 引导式在线课件:
lessons/s5-03/index.html已实现溢出/越界故障卡诊断选择、定位/改型/回归三步、比较符号(=与==)与调试残留两个边界对照、可见反馈和本地进度恢复。任务 2 之后留一空让学习者亲手写累加变量的声明long long sum = 0;——仍写int或unsigned int、只写long、少类型或初值、把sum写成Sum、全角符号或漏分号都会被点出原因,只做文字规则检查,不在浏览器里运行 C++。 - S5-03 随机选择题小测:从 7 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S5-04 引导式在线课件:
lessons/s5-04/index.html已实现开始策略/标注限制选择、基线/标注/升级三步、伪优化识别与验证方式两个边界对照,并在只读脚手架里亲手写出一行sum[r] - sum[l - 1];(减反成sum[l] - sum[r]、用加法、两样都从数组a里取、拿长度n当右端点、多减或多加 1 都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S5-04 随机选择题小测:从 7 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S5-05 引导式在线课件:
lessons/s5-05/index.html已实现开始顺序/记录方式选择、浏览排序/自测记录/时间检查三步、时间不够时的处理与自测表记录方式两个边界对照,并在只读脚手架里亲手写出一行if (n == 0) { cout << 0 << "\n"; return 0; }(只写一个等号变成赋值、拿a[1]当空数据判断、条件写成对正常数据也成立的n >= 0、用会反复做的while、漏掉return 0;或输出都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S5-05 随机选择题小测:从 7 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S5-06 引导式在线课件:
lessons/s5-06/index.html已实现分类优先/改法方向选择、找错/归类/写改法并重做三步、时间不够时的处理与拿不准分类记录方式两个边界对照,并在只读脚手架里亲手写出一行i <= n(写成i < n会漏掉最后一个下标、i + 1 <= n是同一个漏格、i > n方向反、把上界写成数组大小105都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S5-06 随机选择题小测:从 8 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S5-07 引导式在线课件:
lessons/s5-07/index.html已实现开始前带上上次习惯/交叉检查判断选择、独立解题/交叉检查/习惯记录三步、对照两次时间分配与习惯是否稳定两个边界对照,并在只读脚手架里亲手写出一行long long formula = 1LL * n * (n + 1) / 2;(漏掉1LL会让n * (n + 1)先按int算到溢出、两个因数交换顺序等价会被说明、全角符号或漏分号都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S5-07 随机选择题小测:从 7 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- S5-08 引导式在线课件:
lessons/s5-08/index.html已实现整理知识地图/标注薄弱模块判断选择、知识地图/薄弱项标记/赛前清单三步、薄弱模块复习优先级与 CSP-S 衔接边界两个边界对照,并在只读脚手架里亲手写出一行int cnt[105] = {0};(写成= 0只把第一个格子设成 0、只声明不给初值、漏掉元素类型int或末尾分号都会被点出原因,只做文字规则检查,不编译或执行学习者写的 C++)、可见反馈和本地进度恢复。 - S5-08 随机选择题小测:从 7 道已通过校验的选择题中随机抽取 3 道;同次无重复,提交后显示得分与解析。题库来源为本课 course-plan / 自编。
- 初学者常见问题词条:
glossary/faq.json提供基础解释;S1-01 中的g++、.cpp、main、cout等可点开查看;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 衔接条件同样可点开,并给出可选的权威外部链接。 - 题库内容机器校验与证据留痕:40 课 215 道题逐题独立盲解(只给题干与选项、不给标注答案)并与课件答案比对,打乱选项顺序后整批重解仍全部一致;算术与语言行为用本机 g++ 实测。证据与题目内容哈希绑定写在
docs/review/question-verification.json,页面文案与lesson.json的标记同步为「已通过校验 /machine-checked」。这轮校验当场发现并修掉 4 处真实问题(含 215 道题正确答案全部排在第 1 个选项),并由tests/question-verification.test.ts守住:题目一改证据就作废、答案位置重新集中、或页面宣称「人工审校 / 已审校」都会当场失败。 - 静态站点构建与发布:
bun run build把index.html、glossary/与lessons/重新复制到dist/,bun run deploy先构建再用bunx wrangler deploy发布到 Cloudflare Workercsp-cpp-courseware(自定义域名 https://cplus.talkincode.net;配置见wrangler.jsonc,课程地址的末尾斜杠跳转由静态资源的html_handling负责,Worker 入口src/index.ts只把 404 换成中文说明)。产物只能来自仓库内容,因此不会再出现「仓库已经补到 40 节课、线上还停在 4 节课」的漂移——那次漂移的根因正是构建与部署只在某台机器上手工跑过一次、此后再没人重跑。tests/deploy-assets.test.ts在bun test里守住这条链路:产物覆盖courseData的每一节课、旧产物不残留、课程地址的末尾斜杠跳转与中文 404 仍在、部署目标与文档一致。同一套浏览器复验也可以直接打在线上:CSP_E2E_ORIGIN=https://cplus.talkincode.net bun tests/e2e/flow-cdp.ts会复用已在运行的服务、不再自启开发服务器,线上已跑过 S5-07/S5-08 的整课推进与 S5-08/S3-01 的微练习。发布默认不再靠人记得:main 上的推送由.github/workflows/test-and-deploy.yml自动跑「bun test→bun run deploy→ 线上抽检(每一节课、末尾斜杠跳转、词条面板、中文 404)」,缺CLOUDFLARE_API_TOKEN时发布步骤明确失败而不是静默跳过。 - 本地开发服务器内容边界:
bun run dev只监听127.0.0.1(要改就用HOST),并且只服务站点自己的那三份内容。以前它把整个仓库目录当网站:请求什么路径就拼出同名文件,于是/.git/config、/wrangler.jsonc、/AGENTS.md在本地都是 200、线上都是 404,同一个地址在两处表现不一致;Bun.serve默认又监听所有网卡,同一局域网内的任何人都能这样把仓库连同.git读走。现在内容清单由src/site.ts的SITE_SOURCES定义一次,构建、开发服务器与线上 Worker 读的是同一份;站点之外的地址与缺课的地址给出与线上一致的中文 404,/lessons/s1-01这类少了末尾斜杠的目录地址跟线上一样 307 跳到带斜杠的地址(目录不存在就不跳,直接 404,避免缺课地址多绕一圈)。tests/dev-server.test.ts在bun test里守住这套边界。 - 内容结构校验:
tests/curriculum.test.ts会校验 5 个阶段、40 节课、唯一标识及每节课的目标/内容/检验项结构。 - 手工端到端脚本:
tests/e2e/manual-checklist.md覆盖导航、课件阅读和本地进度恢复的基础路径。
- 不把本项目建设为在线判题系统、代码云执行平台或题库爬虫。
- 不把 CSP-S、NOIP、NOI 的高级算法作为 CSP-J 初学者的隐性必修内容。
- 不要求账号登录,不采集未成年人姓名、学校、联系方式、学习画像或公开排名。
- 不提供标准答案堆砌;课件必须优先解释思考过程、边界条件和自测方法。
- 不把“随机出题”理解为临时拼接或未经校验的生成式题目;正式试题、答案和解析必须可追溯、可复现。
- 不依赖付费 SaaS、专有运行时或复杂构建链才能阅读课程入口;在线视频与测试资源可以在线发布,但资源不可用时必须有明确状态与恢复路径。
每一个 Sx-xx 都应从课程目录中的一条记录成长为可独立完成的在线学习界面:学习目标、互动讲解、最小示例、思考提示、课内检验与下一步入口都围绕该课组织。学习者可以按路径连续学习,也能从链接直接进入某一课而不丢失上下文。
每一个在线学习单元可与目标完全对应的外部视频课件相连。视频不是网页文字的无差别朗读:它要承担演示代码运行、拆解思考过程、展示常见错误或引导练习中的至少一种不可替代作用,并配有章节定位和字幕或文字稿。本仓库不实现视频生产、存储、转码或播放;只保证课程 ID、目标和外部交付状态能够准确对齐。
每节课应提供可重复参加的在线测试。每次测试从已通过校验、带目标标签的问题库中抽取不同题目;选择题严格占多数,但可以保留少量适合该课的非选择题。随机过程要可复现,同一次尝试不得重复出题,提交后必须显示得分、逐题解析及指向薄弱目标的复习出口。测试要测“是否理解本课”,不能以陌生难题替代教学。
目标、互动内容、视频元数据、题库和解析应保持一条可追溯的课程事实链。课程目标变更时,相关互动步骤、视频章节、测试题和解析均需要检查,不得出现“课程讲 A、测试考 B”或“目录写 A、视频讲 B”的漂移。
在线发布应让学习者随时进入课程,而不是迫使其先注册或交出个人资料。首版仍以无账号、无排行榜、无在线代码执行为边界;如果日后确有必要引入身份或教师功能,必须先修改项目边界并补齐权限、隐私和双角色验收。
- 任何一节课都能在一分钟内看出它的先修关系、目标、互动学习入口、检验方式和练习出口;如有外部视频交付,也能看出它与课程的对应状态。
- 零基础学习者能从第一阶段开始,逐步完成第四、第五阶段的 CSP-J 专项与模拟,而不必猜测下一步该学什么。
- 每节课的网页互动在桌面和手机上均可完成;资源加载、操作成功、失败与恢复状态都能被学习者理解。
- 外部视频课件可以定位到对应知识点,并提供字幕或文字稿;本仓库不会把视频资源异常伪装为“已完成”状态。
- 每次在线测试都能生成不重复的有效试卷,选择题占多数,提交后给出可验证的得分、解析和复习出口。
- 内容维护者新增或调整课程时,会同时检查课程规划、互动内容、视频元数据、题库、功能清单和验收矩阵;结构错误会被自动校验挡下。
覆盖底线(硬性规定):
- 每个一级功能至少有一条 Happy Path E2E。
- 每个高风险功能至少覆盖一条失败路径。
- 每个涉及权限的功能至少验证两种角色。
- 每个会修改系统状态的操作至少验证一次失败后的恢复或回滚。
- 每次新增一级业务功能,必须同步新增对应的 E2E 并更新本矩阵。
| 一级功能 | 风险级别 | Happy Path E2E | 失败路径 | 权限角色覆盖 | 失败恢复/回滚 | 证据(测试路径/用例) |
|---|---|---|---|---|---|---|
| 五阶段课程路径浏览 | 低 | ✅ | 不适用:只读导航 | 不适用:无账号 | 不适用:不修改状态 | E2E-01 |
| 单课件目标、内容与练习阅读 | 低 | ✅ | 不适用:只读内容 | 不适用:无账号 | 不适用:不修改状态 | E2E-02 |
| 检验清单与学习进度保存 | 中 | ✅ | ✅ 存储失败不崩溃且保留当前会话状态 | 不适用:无账号 | ✅ 刷新后恢复;存储失败时明确提示并可继续学习 | E2E-03、E2E-04 |
| 课程内容结构维护 | 中 | ✅ | ✅ 缺字段、重复 ID 或阶段失衡会失败 | 不适用:无账号 | 不适用:内容校验不修改运行态 | tests/curriculum.test.ts |
| 每课目录与交付状态 | 中 | ✅ | ✅ 缺少课程目录或状态元数据会被校验发现 | 不适用:无账号 | 不适用:结构校验不修改运行态 | tests/lesson-directories.test.ts、bun run scaffold:lessons --check |
| 每课互动页面脚本语法完整性 | 中 | ✅ | ✅ 首页与全部 40 课内嵌脚本逐一编译校验,语法错误会立即失败 | 不适用:无账号 | 不适用:静态语法校验不修改运行态 | tests/inline-script-syntax.test.ts |
| 全课程在线学习契约一致性 | 中 | ✅ 由 courseData 派生全部 40 课 |
✅ 难度档位越界(如 extra)、缺少“不会在浏览器里运行 C++”边界声明、词条未接线或声明后未使用都会被挡下 |
不适用:无账号 | 不适用:静态契约校验不修改运行态 | tests/lesson-contract.test.ts |
| 学习尝试恢复(保存失败可见、可重试、恢复后补写) | 中 | ✅ 首页与全部 40 课的保存成功路径逐课验证 | ✅ 会话中途写入被浏览器拒绝时当次立刻说明“没有保存成功、刷新后不会恢复进度”,不伪装成已保存,互动不中断 | 不适用:无账号 | ✅ 提示里提供“重试保存”;恢复后提示消失、说明“本地保存已恢复”并把期间待写进度补写落盘 | tests/storage-recovery.test.ts、E2E-06、E2E-S1-01-06 |
| 微编程浏览器自动化复验(S1-02 至 S1-08、S2-01 至 S2-08、S3-01 至 S3-08、S4-01 至 S4-08、S5-01 至 S5-08 样板) | 中 | ✅ 659 项检查覆盖 39 课手写填空(每课 16 至 17 项),bun run e2e:s1-typed / bun run e2e:s2-typed / bun run e2e:s3-typed / bun run e2e:s4-typed / bun run e2e:s5-typed / bun run e2e:typed 自动启停浏览器与服务 |
✅ 每课验证空提交、全角符号、语义写错(S1:把更新写成 == 而不是 = / 漏括号写成 a + b / 2 / 连续读入写成 cin >> a, b; / >= 丢掉等于 / 循环上界写成 i < n / 内层循环变量写成 r / 多写字符写成 ;n;S2 起:越界下标 / 漏括号 / 参数或大小写不符 / 写引用或指针 / 取错成员 / 换同一格或跳格 / 该取个位写成 x / 10 / 递归括号里还是 n 到不了边界 / 中点漏括号写成 left + right / 2 / 前缀和漏减 1 写成 sum[i] / 窗口两步写成 sum += a[right]; right++ / 贪心排序按开始时间排 by_start / 弹栈写成只看不弹的 st.top() / DP 转移把两类走法相乘 / 剪枝写成 if (sum >= target) return; / 计数写成 cnt[score] = 1; 覆盖已数次数 / 转移漏写金额 max(dp[i - 1], dp[i - 2]) / 干净输出写成 cin >> n + 1; / 累加写成 sum = a[i]; 覆盖掉前面的和 / 边界把允许的 0 写成 > 0 / 防止重复访问写成条件写反的 if (!visited[u]) return; / 保底条件写成子任务 2 上限 if (n <= 100000) / 分段输出把方向写成读入 cin >> i >> prefix; / 累加变量仍写 int sum = 0; 装不下 / 区间和漏减 1 写成 sum[r] - sum[l] / 空数组判断写成 if (n == 1) / 循环范围漏掉等号写成 i < n / 按审题圈出的范围开数组正好差一格写成 int a[100000]; / 交叉检查漏写 1LL 让 n * (n + 1) 溢出 / 计数数组清零写成标量 int cnt[105] = 0;)三类失败路径均给出具体指正且不算完成 |
不适用:无账号 | ✅ 刷新后恢复草稿与完成状态;重置可清空;输入内容原样保留且不会被当成 HTML 或正确答案 | tests/e2e/s2-typed-cdp.ts、S2 复验记录、S3 复验记录、S4 复验记录、S5 复验记录、S1 复验记录 |
| 单课浏览器自动化复验(S1-01 样板) | 中 | ✅ 88 项检查覆盖八个场景,bun run e2e:s1-01 自动启停浏览器与服务 |
✅ 存储不可用、会话中途保存失败、词条表载入失败、词条面板脚本未载入与题库异常(空题库、答案越界)五条失败路径在真实浏览器中验证 | 不适用:无账号 | ✅ 脚本临时改写题库后会强制还原并断言“临时改动已还原”;保存失败后重试会补写落盘;词条表恢复后回到刚才点开的词条;面板脚本 404 时当场说明且不中断其他互动 | tests/e2e/s1-01-cdp.ts、复验记录 |
| 先修关系可见与可达(全部 40 课样板) | 中 | ✅ 全部 40 节课逐课在真实浏览器里复验「进页面第一眼就知道要先会什么、而且点得回去」:bun run e2e:prereq 242 项检查(40 课各 6 项:5 项笔记本视口检查 + 1 项手机竖屏检查;另含脚本自检 2 项。2026-09-21 Chrome 153 无头) |
✅ 指向不存在课程的死链、链接被其它元素盖住、先修块被挤出首屏、键盘走不到、页面文字与 courseData 不一致都会失败;脚本自检会先插一条死链并确认它被抓到,检查器空转同样失败 |
不适用:无账号 | 不适用:只读导航,不修改状态 | tests/prerequisite-path.test.ts、tests/e2e/prereq-cdp.ts、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/e2e/keyboard-cdp.ts、键盘清单 |
| S1-01 引导式在线学习界面 | 中 | ✅ 已复验:88 项浏览器检查(bun run e2e:s1-01,2026-09-21 Chrome 153 无头) |
✅ 错误选择、未解锁任务、存储不可用、会话中途保存失败、词条表载入失败与词条面板脚本未载入均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制并可重试保存;词条表失败时可重新载入;面板脚本载入失败时给出重新载入本课入口 | S1-01 E2E、tests/e2e/s1-01-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、E2E-s1-typed、E2E-flow |
| S1-03 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,bun run e2e:s1-typed);整课推进与随机小测已复验(bun run e2e:flow,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) |
✅ 错误公式、跳过整除/取模和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | S1-03 E2E、E2E-s1-typed、E2E-flow |
| S1-04 引导式在线学习界面 | 中 | ✅ 微编程 16 项浏览器检查已复验(2026-09-21,bun run e2e:s1-typed);整课推进与随机小测已复验(bun run e2e:flow,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) |
✅ 错误读入、跳过空格/换行和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | S1-04 E2E、E2E-s1-typed、E2E-flow |
| 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、E2E-s1-typed、tests/s1-05-typed-condition.test.ts、E2E-flow |
| 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、E2E-s1-typed、E2E-flow |
| 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、E2E-s1-typed、E2E-flow |
| S1-08 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,bun run e2e:s1-typed);整课推进与随机小测已复验(bun run e2e:flow,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) |
✅ 错误分类、跳过读报错/定位行和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务与答题状态;存储失败时说明限制 | S1-08 E2E、E2E-s1-typed、E2E-flow |
| 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/s2-01-typed-last-index.test.ts、E2E-s2-typed、E2E-flow |
| 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/s2-02-typed-last-char.test.ts、E2E-s2-typed、E2E-flow |
| 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/s2-03-typed-function-call.test.ts、E2E-s2-typed、E2E-flow |
| 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/s2-04-typed-pass-by-value.test.ts、E2E-s2-typed、E2E-flow |
| 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/s2-05-typed-member-access.test.ts、E2E-s2-typed、E2E-flow |
| 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/s2-06-typed-swap.test.ts、E2E-s2-typed、E2E-flow |
| 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/s2-07-typed-enum.test.ts、E2E-s2-typed、E2E-flow |
| 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/s2-08-typed-complexity.test.ts、E2E-s2-typed、E2E-flow |
| 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/s3-01-typed-digit.test.ts、E2E-s2-typed、E2E-flow |
| 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/s3-02-typed-recursion.test.ts、E2E-s2-typed、E2E-flow |
| 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/s3-03-typed-midpoint.test.ts、E2E-s2-typed、E2E-flow |
| 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/s3-04-typed-prefix.test.ts、E2E-s2-typed、E2E-flow |
| 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/s3-05-typed-window.test.ts、E2E-s2-typed、E2E-flow |
| 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/s3-06-typed-greedy.test.ts、E2E-s2-typed、E2E-flow |
| 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/s3-07-typed-pop.test.ts、E2E-s2-typed、E2E-flow |
| 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/s3-08-typed-transition.test.ts、E2E-s2-typed、E2E-flow |
| 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/s4-01-typed-clean-output.test.ts、E2E-flow |
| 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/s4-02-typed-accumulate.test.ts、E2E-flow |
| 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/s4-03-typed-guard.test.ts、E2E-flow |
| 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、E2E-flow |
| 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、E2E-flow |
| S4-06 引导式在线学习界面 | 中 | ✅ 微编程 17 项浏览器检查已复验(2026-09-21,bun run e2e:s4-typed);整课推进与随机小测已复验(bun run e2e:flow,每课 20 项浏览器检查,2026-09-21 Chrome 153 无头) |
✅ 错误状态定义/处理思路、跳过转移步骤、转移那一行的空提交/全角符号/漏写金额写错和存储不可用均给出明确反馈 | 不适用:无账号 | ✅ 刷新后恢复任务、手写填空答案与答题状态;存储失败时说明限制 | S4-06 E2E、E2E-flow |
| 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/s4-07-typed-visited-guard.test.ts、E2E-flow |
| 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/s4-08-typed-fallback.test.ts、E2E-flow |
| 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/s5-01-typed-array-size.test.ts、E2E-flow |
| 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/s5-02-typed-debug-print.test.ts、E2E-flow |
| 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/s5-03-typed-long-long.test.ts、E2E-flow |
| 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/s5-04-typed-range-query.test.ts、E2E-flow |
| 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/s5-05-typed-empty-guard.test.ts、E2E-flow |
| 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/s5-06-typed-loop-bound.test.ts、E2E-flow |
| 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/s5-07-typed-cross-check.test.ts、E2E-flow |
| 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/s5-08-typed-array-init.test.ts、E2E-flow |
| 外部视频课件交付状态 | 低 | 仓库外实现 | 不适用:视频生产和播放不属于本仓库 | 不适用:无账号 | 不适用:本仓库只读关联状态 | 外部交付流程负责;本仓库不得伪造状态 |
| S1-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:s1-01,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S1-01 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S1-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S1-02 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S1-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S1-03 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S1-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S1-04 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S1-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S1-05 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S1-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S1-06 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S1-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S1-07 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S1-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S1-08 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S2-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S2-01 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S2-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S2-02 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S2-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S2-03 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S2-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S2-04 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S2-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S2-05 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S2-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S2-06 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S2-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S2-07 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S2-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S2-08 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S3-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S3-01 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S3-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S3-02 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S3-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S3-03 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S3-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S3-04 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S3-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S3-05 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S3-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S3-06 E2E、tests/lesson-directories.test.ts、E2E-flow |
| 初学者常见问题词条 | 低 | ✅ | ✅ 词条缺失、目录载入失败、返回 HTTP 错误或词条面板脚本本身未载入时明确说明,且不中断课件其他互动 | 不适用:无账号 | ✅ 失败时保留“重新载入词条表”入口,恢复后回到学习者刚才点开的词条,不把失败写成已载入;面板脚本 404 时改用“重新载入本课”入口且不假装修好 | tests/faq.test.ts、tests/faq-panel-recovery.test.ts、tests/faq-panel-fallback.test.ts、E2E-07、S1-01 E2E-08、S1-01 E2E、S1-02 E2E、S1-03 E2E、S1-04 E2E、S1-05 E2E、S1-06 E2E、S1-07 E2E、S1-08 E2E、S2-01 E2E、S2-02 E2E、S2-03 E2E、S2-04 E2E、S2-05 E2E、S2-06 E2E、S2-07 E2E、S2-08 E2E、S3-01 E2E、S3-02 E2E、S3-03 E2E、S3-04 E2E、S3-05 E2E、S3-06 E2E、S3-07 E2E、S3-08 E2E、S4-01 E2E、S4-02 E2E、S4-03 E2E、S4-04 E2E、S4-05 E2E、S4-06 E2E、S4-07 E2E、S4-08 E2E、S5-01 E2E、S5-02 E2E、S5-03 E2E、S5-04 E2E、S5-05 E2E、S5-06 E2E、S5-07 E2E、S5-08 E2E |
| S3-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S3-07 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S3-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S3-08 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S4-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S4-01 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S4-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S4-02 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S4-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S4-03 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S4-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S4-04 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S4-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S4-05 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S4-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S4-06 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S4-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S4-07 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S4-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S4-08 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S5-01 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S5-01 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S5-02 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S5-02 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S5-03 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S5-03 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S5-04 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S5-04 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S5-05 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S5-05 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S5-06 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S5-06 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S5-07 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S5-07 E2E、tests/lesson-directories.test.ts、E2E-flow |
| S5-08 随机在线测试 | 中 | ✅ 每题检查目标绑到本课学习目标原文并另起一行显示更细的本题检查;已在真实浏览器里逐条复核(bun run e2e:flow,2026-09-21 Chrome 153 无头) |
✅ 未答完不得提交;错误答案展示正确解析;未通过时按学习目标汇总错题,并把每条错题目标点回讲它的那个任务(真实浏览器里点过:面板真的切过去、焦点落到该任务的标题、状态区播报回看位置);空题库或题目无效时明确告知 | 不适用:无账号 | ✅ 刷新后恢复本次试卷与作答;可换一套题重新开始;组卷失败时保留进度 | S5-08 E2E、tests/lesson-directories.test.ts、E2E-flow |
| 题库内容机器校验与证据留痕 | 中 | ✅ 40 课 215 道题逐题独立盲解(只给题干与选项、不给标注答案),打乱选项顺序后整批重解一遍,与课件答案逐题比对全部一致;涉及算术与语言行为的判断用本机 g++ 实测;证据与题目内容哈希绑定写入 docs/review/question-verification.json,页面文案与 lesson.json 同步为「已通过校验 / machine-checked」 |
✅ 改了题干、选项顺序或答案而不重新校验,证据哈希对不上会当场失败;答案位置重新集中到同一个选项、证据里出现不一致结论、或页面宣称「人工审校 / 已审校」也会当场失败 | 不适用:无账号 | ✅ 证据作废即失败,必须重新盲解并更新证据文件;题库改动与证据更新必须同一次提交 | tests/question-verification.test.ts、docs/review/question-verification.json、tests/lesson-contract.test.ts |
| 题库与答案解析维护 | 中 | ✅ 40 课题库逐题校验课程 ID、目标、难度档位、题型、答案索引、解析与来源;组卷侧另验题数、同次不重复、只出选择题、种子可复现与题库不被就地改写;每题还用 objectiveIndex 绑到本课学习目标条目 |
✅ 空题库、答案越界、题型不符、缺少题干、来源不明或在抽题时改写题库都会当场失败;题目目标越界、题库题数与 lesson.json 不符也会当场失败 |
不适用:无账号 | 不适用:静态校验不修改已发布题库 | tests/lesson-contract.test.ts、tests/quiz-paper-contract.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 课共 780 项)在真实浏览器复验 |
✅ 目标越界、讲义目标副本与 courseData 漂移、题库题数与元数据不符、docs/feature-checklist.md 写的题库题数与现场不符、未通过的试卷说不出错题落在哪条目标、文档把未覆盖的学习目标点名成已被覆盖的那条,都会当场失败 |
不适用:无账号 | 不适用:静态校验不修改已发布题库 | tests/objective-binding.test.ts、tests/quiz-facts-prose.test.ts、S1-01 E2E、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、E2E-flow、flow 清单 |
| 静态站点构建与发布 | 中 | ✅ 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 当场失败 | 不适用:无账号 | ✅ 构建每次清空重建 dist/,重复发布幂等;线上出错可用 bunx wrangler rollback 退回上一个版本;main 上的推送由 .github/workflows/test-and-deploy.yml 自动发布(bun test 通过才发布,发布后抽检线上) | tests/deploy-assets.test.ts、tests/ci-workflow.test.ts、scripts/build.ts、src/index.ts、wrangler.jsonc、.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、scripts/dev.ts、src/site.ts |
本项目当前无权限模型,故权限角色覆盖均不适用;一旦新增账号或教师端,相关行必须立即改为双角色验证,且在实现前不得宣称功能完成。
题库的结构性约束(课程 ID、难度档位、题型、答案索引、解析、来源、组卷唯一性与可复现性)由自动化校验守住;答案的语义正确性在 2026-09-21 由独立盲解逐题核过(215/215 与课件答案一致,打乱选项顺序后整批重解仍一致),并当场发现并修掉 4 处问题:s5-03 的溢出示例其实不溢出、s5-04 一处题干默认了未给出的约定、s5-04 一处后果写反、以及全部 215 道题的正确答案都排在第 1 个选项(见 docs/review/question-verification.json 的 findings)。这仍是机器校验而不是人工逐题阅读:题目措辞是否适龄、讲解与学习目标的匹配感没有逐条人工看过,页面与文档不得宣称“人工审校”或“已审校”,只能写“已通过校验”。题目内容一改,对应证据立刻作废,必须重新校验并更新证据文件。2026-09-21 起「检查目标」不再是自由文本:每道题带 objectiveIndex,讲义页显示的「检查目标」直接取本课 courseData 的学习目标原文,并在下一行给出更细的「本题检查」;补充题库时只需在 index.html 里填这条索引,页面文案就跟着学习目标走。tests/objective-binding.test.ts 守住这条绑定:讲义里的目标副本要与 courseData 逐条一致、索引必须落在本课目标范围内、lesson.json 里的覆盖数据要与现场相符,改漏任何一处都会失败。绑定只解决「题目对得上哪条目标」,不证明答案语义正确;答案语义由上面那条机器校验链(独立盲解 + 证据留痕)覆盖。逐课覆盖实况写在 lesson.json 的 assessment.objectiveCoverage 与 uncoveredObjectives 里:40 课三条目标全覆盖,已经没有“某条学习目标在题库里一道题都没考到”的课——lessons/s1-03/(补「把文字公式翻译成 C++ 表达式」)、lessons/s1-08/(补「养成可检查的代码书写习惯」)、lessons/s5-06/(补「重做关键题验证修复」)三条缺口已在补题后划掉。这份点名清单由 tests/quiz-facts-prose.test.ts 绑回课程事实:写成别的课的目标、或者补完题忘了划掉旧缺口都会失败。发布不再是人工动作:main 上的每次推送由 .github/workflows/test-and-deploy.yml 先跑 bun test 再 bun run deploy,并在发布后抽检线上(每一节课、末尾斜杠跳转、词条面板、中文 404);bun test 仍然要在本地改动时自己跑,CI 只是兜底。
- 代码、可运行校验和手工验收记录是当前能力的事实来源;文档与它们冲突时,先标注文档需修订。
- 新需求进入前先检查是否违反“非目标(铁律)”;若违反,必须先由项目负责人显式改变边界。
- 新增一级功能时,同步新增 Happy Path E2E、更新本矩阵,并满足适用的失败/权限/恢复覆盖底线。
- 课程从“规划”变为“在线可学习”时,互动界面、测试、题库元数据及其验收证据必须一起到位;缺一项就只能标为规划。视频课件由仓库外流程管理,不作为本仓库实现状态的前置条件。
- 题库、答案、解析和随机组卷规则变更时,必须重新验证同次无重复、选择题占多数、检查目标与
courseData学习目标的绑定(objectiveIndex、讲义里的目标副本、lesson.json的覆盖数据)、答案正确性和可复现性。 - 发布静态站点只走
bun run deploy生成产物(它内部会先bun run build);main 上的推送由.github/workflows/test-and-deploy.yml自动完成「bun test→ 发布 → 线上抽检」,人工发布是它不可用时的兜底。不得手工拼装dist/或发布未提交的改动,线上内容必须等于仓库的构建结果。 - 只有目标画像、边界或一级能力变化时才更新本文档;日常任务进度不应污染项目画像。