acmer-coach 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  ## 它到底做了什么
22
22
 
23
- 20 个工具,两条轴:
23
+ 26 个工具,三条轴:知识图、比赛能力、训练证据。
24
24
 
25
25
  | 轴 | 含义 |
26
26
  |---|---|
@@ -30,6 +30,8 @@
30
30
  核心闭环:
31
31
 
32
32
  ```
33
+ coach_curriculum assess 查真实记录 → 目标与前置排序 → 建有依据的阶段
34
+ ↓ 缺依据先诊断;保存本周主线;产生新证据并验收后推进
33
35
  coach_setup 首次:体检 → 建目录建库 → 灌题池 → 从 CF 同步数据
34
36
  coach_import 洛谷/牛客的记录从这里进(CF 不用,有公开接口)
35
37
  ↓
@@ -43,10 +45,65 @@ coach_log 过了 → 记一条,然后夸
43
45
  coach_pool → coach_test → coach_grade 章节检测,过了才标「已验证」
44
46
  ↓
45
47
  coach_schedule → coach_plan 排课
48
+ ↓
49
+ coach_target → coach_vp_import → coach_postmortem → coach_focus
50
+ ↓ 比赛目标、VP 复盘、当前重点
51
+ coach_scope 适用范围、延伸、反例、退出条件
46
52
  ```
47
53
 
48
54
  `coach_wiki` 是知识来源:讲任何知识点之前先查本地 OI Wiki,**别凭记忆讲**。
49
55
 
56
+ ### 目标驱动训练
57
+
58
+ 知识图只回答“有哪些知识点”,不回答“为什么现在学它”。先用
59
+ `coach_target` 设置比赛、日期、目标结果、团队模式、可用时间和能力优先级,
60
+ 再用 `coach_vp_import` 导入 VP,`coach_postmortem` 写复盘,`coach_focus` 计算当前
61
+ 训练重点。每次布置都要能说清楚它服务哪个比赛能力、适用范围、迁移题和退出条件。
62
+
63
+ VP 记录格式是 JSON 数组,每场至少包含 `eventId`、`contest`、`date` 和 `problems`:
64
+
65
+ ```json
66
+ [{"eventId":"vp-西安-01","contest":"区域赛 VP","date":"2026-10-10",
67
+ "durationMinutes":300,"teamMode":"team","problems":[
68
+ {"problemId":"A","status":"AC","readMinutes":8,"solveMinutes":22,
69
+ "attempts":1,"competencies":["contest-reading"]}]}]
70
+ ```
71
+
72
+ `coach_scope` 会返回一个能力或知识点的适用范围、延伸、反例、常见错误、迁移题
73
+ 和退出条件。没有人工范围卡片时它会明确拒绝编造,避免把“讲过”误当成“会用”。
74
+
75
+ ### 长期学习路线
76
+
77
+ `coach_curriculum assess` 从已有检测、代码判因、做题记录和日程实际完成中列出
78
+ 可引用的证据;不会把 rating、学习状态或取消的卷子当成短板。每条记录带内容引用
79
+ `id` 和事件身份 `eventId`。训练阶段的每个节点必须有真实记录:`finding=gap`
80
+ 引用失败/超时/依赖提示等短板,`finding=extension` 引用已独立做出或过卷的能力起点。
81
+
82
+ 缺记录时先建 `diagnostic` 阶段,写明要确认的问题与取证方法,不能直接宣布弱项。
83
+ 远期设想用 `provisional` 保留,补足依据前不能执行。每个阶段除能力成果和验收条件外,
84
+ 还要写 `basis`、`goalContribution`、`priorityReason`、`estimatedHours`、`evidenceRefs`、
85
+ `finding`、`kind`、`uncertainty`、`diagnosticMethod`。前置必须来自显式的
86
+ learned/verified 记录,或路线中在此前安排的必验训练,不能从游标位置推定已经学会。
87
+
88
+ `CURRICULUM.yaml` 保存路线与修订历史:`read` 查看,`create` 建立,`revise` 调整,
89
+ `advance` 推进。进入阶段时保存证据事件快照;诊断阶段每个节点需有新的真实观察,
90
+ 训练阶段所有节点必须 verified,且各有新的独立做出或过卷记录。改旧备注、成绩或
91
+ 把同次做题从课表迁入进度,不算新训练。当前诊断也不能通过改种类或删节点逃过验收。
92
+ 写操作带 `expectedRevision` 和理由,避免旧上下文覆盖新计划。
93
+ 路线按剩余 `estimatedHours`、每周预算和目标日期提示容量不足或估算缺失;这只是
94
+ 调整范围的提示,不会把周平均当成精确日程,也不阻止执行。
95
+
96
+ 每轮注入比赛目标、能力重点、长期阶段和未完成单元。`coach_assign` 带课程版本,普通训练
97
+ 限于当前主线;补漏/复习需声明目的和返回依据。完成记录仍归原进度文件,
98
+ 不会因一题 AC 或日历到期自动跳阶段。没有建立课程的用户保持原有工具行为。
99
+
100
+ 本周主线可设置 `focusUntil`,到期先复盘修订。路线不提前占用数月日程,
101
+ `coach_plan` 继续管理近期时间块。旧 v1 路线可读,会标记 `needsReview`;需明确
102
+ 修订当前及后续阶段后迁移 v2,插件不会自动重写。优先级与教学方案仍由模型判断,
103
+ 程序现在会要求目标和 VP 证据先进入策略层;能力卡片仍由仓库维护,未知卡片不会自动臆造。
104
+ 这版仍不包含后台定时同步和自动读取第三方 VP 网站,导出后用 `coach_vp_import` 导入。
105
+ 详见 [长期课程机制](docs/长期课程机制.md)。
106
+
50
107
  **「学过」和「已验证」是两级,绝不合并。** 自评 ≠ 掌握 ——
51
108
  合成一个「会/不会」就等于退回「从数据推断掌握度」,而数据能说「花了很久」,
52
109
  说不出「卡在哪」。所以 `verified` 手标不了,它只能由检测产生。
@@ -153,8 +210,11 @@ dsh 的会话上下文有限 —— 新开一个会话,教练不记得上次
153
210
 
154
211
  | 文件 | 作用 |
155
212
  |---|---|
156
- | `index.js` | 插件本体(host 端,20 个工具 + 规则注入) |
213
+ | `index.js` | 插件本体(host 端,21 个工具 + 规则注入) |
157
214
  | `lib/setup.js` | 环境搭建 + CF 公开数据同步 |
215
+ | `lib/curriculum.js` | 持久课程路线、阶段验收门槛、版本与修订历史 |
216
+ | `lib/curriculum-evidence.js` | 从实际记录派生证据引用与事件身份,去重课表和训练记录 |
217
+ | `lib/curriculum-planning.js` | 阶段编排依据、前置顺序与进入阶段后的新证据检查 |
158
218
  | `lib/client.js` | 浏览器端:会话头部「技能树」按钮 + 弹层 |
159
219
  | `package.json` | 声明 `dsh.bundle.patch` + `dsh.client` |
160
220
  | `cordis.patch.yml` | bundle 层的 insert 行 |
@@ -176,7 +236,7 @@ dsh 的会话上下文有限 —— 新开一个会话,教练不记得上次
176
236
  |---|---|---|
177
237
  | **规则** | `assets/rules/coach-rules.md` | 插件用 `systemPrompt.section()` 注进 system prompt(和人设同一条路)。**改它要重启 dsh** |
178
238
  | **知识** | 地图 4 份 + OI Wiki 检索库 | `coach_setup init` 铺到数据目录;OI Wiki 直接从包里读 |
179
- | **工具** | 19 个 | 装完就在 |
239
+ | **工具** | 21 个 | 装完就在 |
180
240
 
181
241
  规则进的是 **system prompt,不是消息流**:行为约束每轮都得在场,
182
242
  而消息流会被长对话把尾巴挤掉。文本是**静态**的(只在加载时读一次)——
@@ -191,13 +251,13 @@ dsh 的会话上下文有限 —— 新开一个会话,教练不记得上次
191
251
  | `NODE_ENTRY.yaml` | 每个节点的入门段位(题池 p25),机器算 |
192
252
  | `NODE_META.yaml` | `tier` 标注(core / normal / rare / skip),人维护 |
193
253
 
194
- `PROGRESS.yaml` 和 `SCHEDULE.yaml` **不随包发** —— 它们是你的进度和日程,
254
+ `PROGRESS.yaml`、`SCHEDULE.yaml` 和 `CURRICULUM.yaml` **不随包发** —— 它们是你的进度、日程和课程,
195
255
  首次写入时由插件自己生成(带正确的文件头)。发模板等于给文件头造第二份真相。
196
256
 
197
257
  ## 开发回路
198
258
 
199
259
  ```bash
200
- bash dev.sh # 同步副本 + 验收 + 形状扫描 + 比账本指纹
260
+ bash dev.sh # 同步副本 + 验收 + 形状扫描 + 课程/证据测试 + 比账本指纹
201
261
  ```
202
262
 
203
263
  单独跑:
@@ -207,6 +267,8 @@ node verify.mjs && node verify-shape.mjs # 主验收
207
267
  node dev/w1-check.mjs # 解绑 + 闸门 + 规则注入
208
268
  node dev/wiki-check.mjs # OI Wiki 检索
209
269
  node dev/setup-check.mjs # 冷启动(离线)
270
+ node --test dev/curriculum-check.mjs # 长期课程(隔离数据)
271
+ node --test dev/curriculum-evidence-check.mjs # 证据目录、事件身份与重复记录
210
272
  COACH_TEST_NET=1 node dev/setup-check.mjs <handle> # 冷启动(真打 CF)
211
273
  bash dev/trace-scan.sh # 开源前反证:没留私人痕迹
212
274
  ```
@@ -0,0 +1,92 @@
1
+ version: 1
2
+ competencies:
3
+ - id: contest-reading
4
+ title: 比赛读题与筛选
5
+ contestUse: 在前 30 分钟扫完题面,识别可做题和高风险题,避免漏读与过早开写。
6
+ nodes: []
7
+ appliesTo: [所有区域赛场次]
8
+ extensions: [首轮扫描, 题目分层, 读题时间盒]
9
+ notFor: [把 A 题默认当成签到题, 读一题写一题]
10
+ commonFailures: [漏读题面, 被样例带偏, 没有放弃条件]
11
+ transferProblems: [一场完整 VP]
12
+ exitEvidence: [两场 VP 都记录首轮扫描顺序, 没有漏读题]
13
+ - id: contest-decision
14
+ title: 比赛决策与终局
15
+ contestUse: 根据成功概率、剩余时间和罚时决定继续、换题或集中火力。
16
+ nodes: []
17
+ appliesTo: [区域赛 VP, 最后 60 分钟]
18
+ extensions: [换题阈值, 终局集中, 代码验算分工]
19
+ notFor: [多道难题同时无边界死磕]
20
+ commonFailures: [沉没成本, 最后阶段分散火力, 不复盘换题原因]
21
+ transferProblems: [5 小时团队 VP]
22
+ exitEvidence: [两场 VP 有明确换题记录和终局策略]
23
+ - id: implementation-stability
24
+ title: 实现稳定性
25
+ contestUse: 在限时下把已知套路写成一次通过、边界完整的代码。
26
+ nodes: [数据结构, 二分, 前缀和, 差分, 动态规划基础]
27
+ appliesTo: [中档签到题, 需要快速转化的常见模型]
28
+ extensions: [边界清单, 小样例自测, 重写压缩]
29
+ notFor: [只背模板不理解状态来源]
30
+ commonFailures: [下标错误, 初始化遗漏, 重复提交同一类低级错误]
31
+ transferProblems: [两道未见过的同类题]
32
+ exitEvidence: [两道迁移题限时独立通过, 至少一题隔天复测]
33
+ - id: dp-modeling
34
+ title: DP 建模与迁移
35
+ contestUse: 从题面抽出状态、转移、顺序和复杂度,而不是只认题型名称。
36
+ nodes: [动态规划基础, 区间 DP, 背包 DP, 树形 DP, 状压 DP, 数位 DP]
37
+ appliesTo: [子结构可复用, 状态规模可控, 需要枚举决策顺序]
38
+ extensions: [区间状态, 集合状态, 树上状态, 优化转移]
39
+ notFor: [状态包含不可压缩的全局历史]
40
+ commonFailures: [状态定义含糊, 转移漏情况, 复杂度算错]
41
+ transferProblems: [一道结构相同但题面不同的 DP, 一道隔天迁移题]
42
+ exitEvidence: [能解释状态为何足够, 两道新题独立完成]
43
+ - id: graph-modeling
44
+ title: 图论建模
45
+ contestUse: 识别图结构并选对最短路、连通性、拓扑序、树或网络流模型。
46
+ nodes: [图论基础, 最短路, 拓扑排序, DFS(搜索), 并查集]
47
+ appliesTo: [关系传播, 依赖顺序, 连通块, 路径代价]
48
+ extensions: [DAG DP, 树上问题, 生成树, 流与匹配]
49
+ notFor: [把所有关系题都硬套最短路]
50
+ commonFailures: [建边方向错, 忘记不连通, 复杂度超限]
51
+ transferProblems: [两种表面不同的关系建模题]
52
+ exitEvidence: [限时识别模型并独立写出两题]
53
+ - id: data-structures
54
+ title: 数据结构选型与实现
55
+ contestUse: 根据操作、约束和查询方式选择合适结构并稳定实现。
56
+ nodes: [树状数组, 线段树, 单调队列, 单调栈, 树链剖分]
57
+ appliesTo: [动态维护, 区间查询, 单调性优化]
58
+ extensions: [懒标记, 可持久化, 合并技巧, 复杂度降阶]
59
+ notFor: [数据结构复杂度超过题目实际需求]
60
+ commonFailures: [区间边界错, 懒标记下传错, 结构选重]
61
+ transferProblems: [同结构不同操作题]
62
+ exitEvidence: [模板能从零写出, 新题能说明为何选它]
63
+ - id: math-combinatorics
64
+ title: 数学与组合建模
65
+ contestUse: 把计数、模运算、概率和构造题压成可计算的结构。
66
+ nodes: [排列组合, 数论基础, 概率论, 博弈论]
67
+ appliesTo: [计数, 期望, 模意义运算, 不变量]
68
+ extensions: [容斥, 生成函数, 矩阵快速幂, 组合恒等式]
69
+ notFor: [只凭样例猜规律]
70
+ commonFailures: [重复计数, 模逆不存在, 边界概率遗漏]
71
+ transferProblems: [两道不同叙事的计数题]
72
+ exitEvidence: [能写出计数对象和去重方式, 一题隔天复测]
73
+ - id: code-review
74
+ title: 代码检查与调试
75
+ contestUse: 在提交前快速发现边界、溢出、复杂度和实现偏差。
76
+ nodes: [枚举, 递归 & 分治, 动态规划基础]
77
+ appliesTo: [所有需要限时提交的题]
78
+ extensions: [反例构造, 对拍思维, 小样例清单]
79
+ notFor: [盲目重写整份代码]
80
+ commonFailures: [没有最小反例, 只看样例, 不验证复杂度]
81
+ transferProblems: [给出一份错误代码并定位最小反例]
82
+ exitEvidence: [三次提交前检查都能指出具体风险]
83
+ - id: team-communication
84
+ title: 团队沟通与分工
85
+ contestUse: 让三个人并行推进、及时同步、减少重复劳动和信息丢失。
86
+ nodes: []
87
+ appliesTo: [团队 VP, 区域赛现场]
88
+ extensions: [口头题解格式, 代码交接, 验算角色, 决策记录]
89
+ notFor: [三个人长期各做各的]
90
+ commonFailures: [没人汇报, 两人重复做题, 交接时丢约束]
91
+ transferProblems: [三人 5 小时 VP]
92
+ exitEvidence: [两场 VP 有分工记录和交接记录]
@@ -7,12 +7,66 @@
7
7
 
8
8
  ## 教练职责(核心)
9
9
 
10
+ ### 比赛目标先于知识图
11
+
12
+ * 有比赛目标时,先调 `coach_target read`,再调 `coach_focus`。没有目标时不能用
13
+ rating、游标或地图后继猜长期方向;先建立比赛、日期、结果目标、团队模式、时间预算
14
+ 和能力优先级。
15
+ * `coach_focus` 给的是比赛能力重点,不是知识点清单。每次训练必须说明它服务哪个能力、
16
+ 为什么现在排、暂缓什么,以及用什么表现退出。知识图只负责把能力重点展开成可学节点。
17
+ * 有 VP 时先导入 `coach_vp_import`,赛后调 `coach_postmortem`。VP 的读题、耗时、提交、
18
+ 换题和团队问题优先于 rating;没有 VP 证据时要明确说“尚无记录”,不能装作知道短板。
19
+ * 讲知识点之前调 `coach_scope`。必须说明适用范围、延伸、反例、常见错误、迁移题和退出
20
+ 条件;工具返回“没有范围卡片”时不许凭记忆补一段看似完整的范围。
21
+ * 训练重点是比赛能力,不是沿着地图无限往下走。阶段达到目标后可以停在当前节点,转做
22
+ 迁移题、限时题、VP 或复盘;后继节点只有在它服务当前能力目标时才进入。
23
+
24
+ ### 长期课程先于每日选点
25
+
26
+ * 长期训练先用 `coach_curriculum read` 查看路线,再用 `assess` 查实际编排依据。
27
+ `assess` 从 checks、代码判因、passes 和课表实际完成中给出 `id/eventId`;记录多时
28
+ 按 `evidenceNodes` 缩小范围。**rating、节点状态、取消的卷子不能代替短板证据。**
29
+ * 建立或修订路线前核实目标、起点与可用时间。每个阶段除能力成果、节点和验收条件外,
30
+ 必须填写 `basis`、`goalContribution`、`priorityReason`、`estimatedHours`、
31
+ `evidenceRefs`、`finding`、`kind`、`uncertainty`、`diagnosticMethod`。
32
+ 说清观察到了什么、它怎样服务目标、为何排在这里、预计投入多少,不套统一算法清单。
33
+ * `kind=training` 的每个节点都要对应真实证据:补短板用 `finding=gap`,引用 gap;
34
+ 在已证实能力上进阶用 `finding=extension`,引用 baseline。记录指向什么由你解读,
35
+ 但**不能写一段理由替代不存在的记录**,也不能把别的节点的失败贴来凑依据。
36
+ * 缺依据先安排 `kind=diagnostic/finding=unknown`,写尚待确认的问题和具体取证方法。
37
+ 诊断需用新检测、代码判因或实际做题记录回答问题,再据结果修改后续路线。
38
+ 远期假设用 `kind=provisional/finding=unknown` 保存;待定阶段不能执行或直接进入。
39
+ * 阶段顺序须满足地图前置。只认可显式 learned/verified,以及此前必验训练的节点;
40
+ 同阶段节点也按前置顺序列出。**cursor 的祖先闭包不是已学会的证明。** 布置实际
41
+ 训练时前置仍必须已经有显式记录,不能拿未来阶段的承诺当今天的掌握。
42
+ * 近期细、远期粗;本周主线只从当前阶段取,用 `focusNodes` 和 `focusUntil` 保存。
43
+ * 每次布置前沿用当前阶段和未完成单元,再查地图/日程。`coach_assign` 带
44
+ `curriculumRevision`,`why` 解释这个动作如何服务于阶段成果;不要每轮重新挑方向。
45
+ * 补前置、修失败或到期复习可以暂离主线,用 `purpose` 与 `routeReason` 说明
46
+ 关系和回归条件。当前单元没结束时先完成或明确撤销,别另开一个。
47
+ * 当用户临时问一个算法,正常解释;**问答本身不改变课程路线**。
48
+ * 每周或本周主线到期时,对照计划与真实完成/检测记录复盘;调整走 `revise`,
49
+ 保留理由和版本。不能因为日程变化就悄悄覆盖长期目标。
50
+ * 进入阶段时插件保存已有证据事件快照。诊断验收要求每个节点有新观察;训练验收
51
+ 要求所有节点 verified,并且每个节点有本阶段新的独立做出或过卷事件。
52
+ 改旧备注、修改同条成绩、同次做题从 SCHEDULE 迁入 PROGRESS 都不算新事件。
53
+ **当前诊断不能改成训练或删掉待诊断节点来绕过验收。**
54
+ * 阶段推进由你结合能力验收判断,再调 `advance`,写清来源。缺新证据、必验节点不齐、
55
+ 动作或检测卷未结束时工具会拒绝。机械门槛通过也不等于能力自动达标;
56
+ **刷够题数、讲完内容、到了周末都不能替代能力验收。** 优先级理由仍需教学判断,
57
+ 程序没有证明这条路线教育上最优。
58
+ * 旧 v1 路线可查看,但 `needsReview` 时不能继续执行;先 assess,再 revise 补齐当前
59
+ 及后续阶段的依据,明确迁移 v2。已完成阶段保留,不能自动编造依据或改写旧历史。
60
+ * `coach_plan` 仍只排近期时间块,`coach_curriculum` 保存课程顺序与阶段目标,
61
+ `PROGRESS.yaml` 保存实际学习/检测记录,不复制另一套掌握状态。
62
+
10
63
  用户要当**学生**,不要当老师。他排不了优先级 —— 那恰好是初学者没有的知识
11
64
  (循环依赖:用你还不会的东西决定你该怎么学)。所以**排优先级是教练的活**。
12
65
 
13
66
  下面九条是硬规则,每条都能机械检查。违反就是没做好本职工作:
14
67
 
15
- 1. **给训练指令前,必须先调 `coach_next`**。不许凭印象挑知识点 ——
68
+ 1. **给训练指令前,必须先调 `coach_target`/`coach_focus`,再调 `coach_next`**。
69
+ 不许只凭 rating 或地图后继挑知识点 ——
16
70
  它可能在地图里根本不存在,或者前置还没满足。
17
71
  2. **每条指令必须带地图节点 id**。节点 id 只能从地图取到,
18
72
  所以这条会自动逼你先读地图。