@namewta/speculo 0.8.11 → 1.0.1
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 +10 -6
- package/dist/src/cli.js +12 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/doctor.d.ts +10 -0
- package/dist/src/doctor.js +70 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/index.js +105 -56
- package/dist/src/index.js.map +1 -1
- package/dist/src/kernel.d.ts +98 -0
- package/dist/src/kernel.js +29 -0
- package/dist/src/kernel.js.map +1 -0
- package/dist/src/refresh.js +55 -24
- package/dist/src/refresh.js.map +1 -1
- package/dist/src/structured.d.ts +2 -2
- package/dist/src/structured.js +114 -241
- package/dist/src/structured.js.map +1 -1
- package/package.json +3 -2
- package/template/.speculo/README.md +1 -1
- package/template/.speculo/capabilities.json +14 -0
- package/template/.speculo/kernel/README.md +10 -0
- package/template/.speculo/kernel/capability-profile.schema.json +14 -0
- package/template/.speculo/kernel/checkpoint.schema.json +7 -0
- package/template/.speculo/kernel/trace-event.schema.json +8 -0
- package/template/.speculo/kernel/workflow-manifest.schema.json +13 -0
- package/template/.speculo/kernel.json +10 -0
- package/template/.speculo/refresh-contract.json +4 -1
- package/template/AGENTS.md +0 -3
- package/template/canonical/canonical-specdev-goal-plan.md +13 -7
- package/template/canonical/canonical-specdev-grill-with-docs.md +1 -1
- package/template/canonical/canonical-specdev-orchestrate-implementation.md +29 -11
- package/template/canonical/canonical-specdev-spec.md +1 -1
- package/template/canonical/canonical-specdev-tickets.md +38 -4
- package/template/commands/archive-and-consolidate.md +13 -40
- package/template/commands/status.md +3 -3
- package/template/skills/engineering-standards-builder/README.md +6 -28
- package/template/skills/engineering-standards-builder/SKILL.md +88 -163
- package/template/skills/engineering-standards-builder/examples/README.md +2 -0
- package/template/skills/engineering-standards-builder/manifest.txt +4 -0
- package/template/skills/engineering-standards-builder/references/rules/00-governance-and-precedence.md +22 -29
- package/template/skills/engineering-standards-builder/references/rules/01-project-discovery.md +26 -59
- package/template/skills/engineering-standards-builder/references/rules/02-evidence-topology-and-scope.md +28 -55
- package/template/skills/engineering-standards-builder/references/rules/03-interview-and-decisions.md +4 -3
- package/template/skills/engineering-standards-builder/references/rules/14-generation-contract.md +64 -80
- package/template/skills/engineering-standards-builder/references/rules/15-validation-contract.md +24 -47
- package/template/skills/engineering-standards-builder/references/rules/16-language-adapter-contract.md +11 -48
- package/template/skills/engineering-standards-builder/references/rules/README.md +3 -3
- package/template/skills/engineering-standards-builder/scripts/self-test.mjs +51 -5
- package/template/skills/engineering-standards-builder/scripts/validate-builder.mjs +16 -4
- package/template/skills/engineering-standards-builder/scripts/validate-generated-skill.mjs +166 -64
- package/template/skills/engineering-standards-builder/templates/README.md +12 -3
- package/template/skills/engineering-standards-builder/templates/domain-skill/SKILL.md.template +32 -0
- package/template/skills/engineering-standards-builder/templates/project-skill/SKILL.md.template +16 -11
- package/template/skills/engineering-standards-builder/templates/project-skill/generated-skill-set.json.template +7 -0
- package/template/skills/engineering-standards-builder/templates/project-skill/references/project/00-project-profile.md.template +3 -1
- package/template/skills/engineering-standards-builder/templates/project-skill/references/project/01-module-map.md.template +4 -0
- package/template/skills/engineering-standards-builder/templates/project-skill/references/project/02-decisions-and-exceptions.md.template +1 -1
- package/template/skills/engineering-standards-builder/templates/project-skill/references/project/03-skill-map.md.template +19 -0
- package/template/skills/engineering-standards-builder/templates/project-skill/references/project/04-source-and-template-map.md.template +22 -0
- package/template/skills/engineering-standards-builder/templates/project-skill/references/project/review-checklist.md.template +2 -0
- package/template/skills/git-history-squash/SKILL.md +100 -0
- package/template/skills/git-history-squash/assets/request-template.json +18 -0
- package/template/skills/git-history-squash/references/recovery-contract.md +50 -0
- package/template/skills/git-history-squash/references/rewrite-contract.md +123 -0
- package/template/skills/git-history-squash/references/submodule-contract.md +54 -0
- package/template/skills/git-history-squash/scripts/git-history-squash.mjs +1171 -0
- package/template/workflows/learning/A-archive/A-archive.md +25 -0
- package/template/workflows/learning/A-assess-and-plan/A-assess-and-plan.md +17 -23
- package/template/workflows/learning/A-assess-and-plan/background-template.md +13 -0
- package/template/workflows/learning/A-assess-and-plan/change-status-template.json +21 -14
- package/template/workflows/learning/A-assess-and-plan/course-template.md +28 -0
- package/template/workflows/learning/C-consolidate/C-consolidate.md +33 -0
- package/template/workflows/learning/H-homework/H-homework.md +31 -0
- package/template/workflows/learning/H-homework/homework-template.md +63 -0
- package/template/workflows/learning/I-init-setup/I-init-setup.md +14 -19
- package/template/workflows/learning/I-init-setup/context-index-template.md +3 -3
- package/template/workflows/learning/I-init-setup/learner-profile-template.md +12 -10
- package/template/workflows/learning/I-init-setup/review-index-template.md +1 -1
- package/template/workflows/learning/INDEX.md +7 -9
- package/template/workflows/learning/L-lesson/L-lesson.md +32 -0
- package/template/workflows/learning/L-lesson/lesson-template.md +51 -0
- package/template/workflows/learning/R-review/R-review.md +13 -18
- package/template/workflows/learning/R-review/review-template.md +13 -6
- package/template/workflows/learning/README.md +86 -81
- package/template/workflows/learning/_state/status.json +1 -1
- package/template/workflows/learning/common/rules/artifact-contract.md +11 -25
- package/template/workflows/learning/common/rules/assessment-policy.md +9 -4
- package/template/workflows/learning/common/rules/knowledge-organization.md +4 -6
- package/template/workflows/learning/common/rules/mastery-policy.md +3 -19
- package/template/workflows/learning/common/rules/path-reference-contract.md +3 -5
- package/template/workflows/learning/common/rules/teaching-policy.md +9 -9
- package/template/workflows/learning/common/schemas/change-status.schema.json +46 -18
- package/template/workflows/learning/common/schemas/status.schema.json +25 -24
- package/template/workflows/learning/common/skills/topic-synthesis/SKILL.md +17 -0
- package/template/workflows/learning/common/skills/topic-synthesis/claim-template.md +15 -0
- package/template/workflows/learning/common/tools/relocate-learning.mjs +208 -0
- package/template/workflows/learning/common/tools/validate-learning.mjs +195 -297
- package/template/workflows/learning/manifest.json +1 -0
- package/template/workflows/learning/runtime-contract.json +3 -2
- package/template/workflows/ops/manifest.json +1 -0
- package/template/workflows/person/manifest.json +1 -0
- package/template/workflows/specdev/I-implement/I-implement.md +12 -4
- package/template/workflows/specdev/I-implement/execution-preflight.md +4 -0
- package/template/workflows/specdev/README.md +1 -1
- package/template/workflows/specdev/T-tickets/T-tickets.md +16 -3
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +3 -0
- package/template/workflows/specdev/T-tickets/ticket-template.md +3 -0
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +15 -0
- package/template/workflows/specdev/common/rules/artifact-contract.md +1 -1
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +4 -2
- package/template/workflows/specdev/common/skills/subagent-delivery/references/external-web-subagent.md +2 -1
- package/template/workflows/specdev/common/skills/subagent-delivery/references/native-subagent.md +2 -1
- package/template/workflows/specdev/common/skills/subagent-delivery/references/source-package.md +4 -2
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +143 -3
- package/template/workflows/specdev/manifest.json +1 -0
- package/template/workflows/workflow-manifest.schema.json +14 -0
- package/template/workflows/learning/A-archive-and-consolidate/A-archive-and-consolidate.md +0 -38
- package/template/workflows/learning/A-archive-and-consolidate/promotion-plan-template.md +0 -23
- package/template/workflows/learning/A-assess-and-plan/learning-plan-template.md +0 -28
- package/template/workflows/learning/E-eli5/E-eli5.md +0 -37
- package/template/workflows/learning/E-eli5/lesson-template.md +0 -31
- package/template/workflows/learning/P-practice/P-practice.md +0 -34
- package/template/workflows/learning/P-practice/practice-template.md +0 -16
- package/template/workflows/learning/Q-quiz/Q-quiz.md +0 -34
- package/template/workflows/learning/Q-quiz/quiz-artifact-template.md +0 -16
- package/template/workflows/learning/common/skills/knowledge-promotion/SKILL.md +0 -46
- package/template/workflows/learning/common/skills/knowledge-promotion/domain-index-template.md +0 -6
- package/template/workflows/learning/common/skills/knowledge-promotion/domain-overview-template.md +0 -19
- package/template/workflows/learning/common/skills/knowledge-promotion/knowledge-template.md +0 -25
|
@@ -1,46 +1,21 @@
|
|
|
1
|
-
# Learning Activation Contract
|
|
1
|
+
# Learning v2 Activation Contract
|
|
2
2
|
|
|
3
|
-
本合同只在用户明确激活 Learning Work 后读取。Learning
|
|
3
|
+
本合同只在用户明确激活 Learning 或其中一个 Work 后读取。Learning 将学习拆成课程设计、完整授课、单文件作业、可选保持复习和用户触发的主题整合;Work 之间不自动串联。
|
|
4
4
|
|
|
5
5
|
## Work 条目
|
|
6
6
|
|
|
7
7
|
<!-- AUTO-INDEX-START -->
|
|
8
8
|
|
|
9
|
-
- **A-archive
|
|
10
|
-
- **A-assess-and-plan** —
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
- **R-review** —
|
|
9
|
+
- **A-archive** — 冷归档:用户明确关闭后移动整个 Change 树到日期目录;不做知识综合或掌握判断。
|
|
10
|
+
- **A-assess-and-plan** — 评估背景并设计课程:以目标和证据为起点建立课程、背景、基线、来源和可变 Lesson 地图。
|
|
11
|
+
- **C-consolidate** — 主题整合:将选定 Change 物理嵌入父 Change,生成带 claim 级 provenance 的可迭代主题综合。
|
|
12
|
+
- **H-homework** — 课程作业与评审:以单一 Markdown 文件生成题目、接收显式提交并追加逐题评审;不与 Lesson 混写。
|
|
13
|
+
- **I-init-setup** — 初始化学习系统:初始化 Learning v2 的教学偏好、空索引、位置登记和可验证状态。
|
|
14
|
+
- **L-lesson** — 完整课程讲解:一次输出 30–40 分钟、通俗但完整的 Lesson;不生成作业、不评分、不宣称掌握。
|
|
15
|
+
- **R-review** — 延迟保持与周期复习:用户主动指定后,用真实时间间隔验证回忆、机制和迁移,并更新 retention evidence。
|
|
16
16
|
|
|
17
17
|
<!-- AUTO-INDEX-END -->
|
|
18
18
|
|
|
19
|
-
## 目标与工件链
|
|
20
|
-
|
|
21
|
-
```text
|
|
22
|
-
[初始化] --> [评估与计划] --> [通俗教学] --> [主动练习] --> [即时测验]
|
|
23
|
-
|
|
|
24
|
-
+-------------------------------------+
|
|
25
|
-
| |
|
|
26
|
-
失败 通过
|
|
27
|
-
| |
|
|
28
|
-
v v
|
|
29
|
-
[通俗教学或练习] [延迟保持测验]
|
|
30
|
-
|
|
|
31
|
-
+------------------------+
|
|
32
|
-
| |
|
|
33
|
-
失败 通过
|
|
34
|
-
| |
|
|
35
|
-
v v
|
|
36
|
-
[通俗教学或练习] [归档与合并]
|
|
37
|
-
|
|
|
38
|
-
v
|
|
39
|
-
[当前知识与索引]
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
权威优先级为:实际项目或可靠来源事实;锁定的 `learning-plan.md`;学习者原始作答;测验 result;promotion plan;永久知识。教学类比、模型总结和索引摘要都不能覆盖更高权威。
|
|
43
|
-
|
|
44
19
|
## 运行时根
|
|
45
20
|
|
|
46
21
|
- 工作流根:`<Path>{roots.workflows}/learning/</Path>`
|
|
@@ -48,72 +23,102 @@
|
|
|
48
23
|
|
|
49
24
|
## 持久化约定
|
|
50
25
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
|
59
|
-
|
|
26
|
+
所有课程、背景、作业、回答、Review、synthesis 和位置登记均写入 `<Path>{roots.state}/learning/</Path>`;工作流模板只提供合同和空骨架。
|
|
27
|
+
|
|
28
|
+
## Work 图与激活
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
I-init-setup -> A-assess-and-plan -> (user chooses) L-lesson
|
|
32
|
+
|\
|
|
33
|
+
| H-homework -> (optional) R-review
|
|
34
|
+
|\
|
|
35
|
+
+-> user questions -> notes/ or a new lesson/change
|
|
36
|
+
|
|
37
|
+
Any active or closed changes --(user chooses C)--> consolidation parent
|
|
38
|
+
Any closed root tree --(user chooses A)--> archive/YYYY-MM/<change>
|
|
39
|
+
```
|
|
60
40
|
|
|
61
|
-
|
|
41
|
+
`L` 完成后只报告已生成的 Lesson 和可选的下一步,不自动激活 `H`;`H` 评审后可结束本轮,不自动激活 `R`、`C` 或 `A`。`C` 和 `A` 都需要用户明确确认,未确认的 dry-run 不得移动或写入 context。
|
|
62
42
|
|
|
63
43
|
## 启动协议
|
|
64
44
|
|
|
65
|
-
|
|
66
|
-
2. 用户指定 change 优先;唯一 active 直接恢复;多个 active 请求消歧;没有时创建 `YYYY-MM-DD-<kebab-topic>[-NN]`。
|
|
67
|
-
3. 新 change 同时写全局 active entry 和 change `.status.json`;只允许日期前缀且不覆盖同名目录。
|
|
68
|
-
4. Work 开始时在两级状态设置相同 `current_work`。已有其他 Work 时先恢复、取消或显式交接。
|
|
69
|
-
5. 只加载当前 Work、所需 common 和通过索引精确选择的知识文件,不遍历全部 context。
|
|
70
|
-
6. Work 成功后去重更新 `works_run` 并清空 `current_work`;阻塞时保留当前 Work 和 blocker;取消不加入 `works_run`。
|
|
71
|
-
7. 只有 Q 可以记录即时通过,R 可以记录保持通过,A-archive 可以设置 completed/archived 和提升永久知识。
|
|
45
|
+
激活时先解析 roots、读取全局 v2 状态和位置登记;按 stable Change ID 解析当前 locator。已有 root lock、未知 schema、v1 状态、路径越界或 parent cycle 时先阻塞,不创建新 Change。
|
|
72
46
|
|
|
73
|
-
##
|
|
47
|
+
## Change 工件布局
|
|
74
48
|
|
|
75
|
-
|
|
49
|
+
普通学习 Change 至少包含:
|
|
76
50
|
|
|
77
|
-
|
|
51
|
+
```text
|
|
52
|
+
changes/<change-id>/
|
|
53
|
+
INDEX.md
|
|
54
|
+
course.md
|
|
55
|
+
background/foundation.md
|
|
56
|
+
baseline.md
|
|
57
|
+
sources.md
|
|
58
|
+
lessons/INDEX.md
|
|
59
|
+
lessons/L-001-<slug>.md
|
|
60
|
+
homework/INDEX.md
|
|
61
|
+
homework/HW-001-<slug>-attempt-01.md
|
|
62
|
+
notes/
|
|
63
|
+
learning-log.md
|
|
64
|
+
.status.json
|
|
65
|
+
```
|
|
78
66
|
|
|
79
|
-
|
|
80
|
-
- `phase`:`intake | assessment | teaching | practice | immediate_quiz | retention | ready_to_archive | archived`。
|
|
81
|
-
- `domain`:稳定 kebab id;`domain_type`:`project | product | subject | language | skill`。
|
|
82
|
-
- `mastery.immediate` 与 `mastery.retention`:`not_attempted | failed | passed | needs_review`。
|
|
83
|
-
- `mastery.critical_objectives_passed`、`transfer_passed`、`blocking_misconceptions` 和 `evidence` 是 result 的状态投影,不替代原始作答和评分文件。
|
|
84
|
-
- `next_review_at` 只在即时通过后安排首次保持测验,或归档后安排周期复习。
|
|
85
|
-
- `completed_at`、`archived_at` 和 `archive_path` 只由 owning Work 在门通过后写入。
|
|
67
|
+
综合父 Change 使用:
|
|
86
68
|
|
|
87
|
-
|
|
69
|
+
```text
|
|
70
|
+
changes/<topic>-consolidation/
|
|
71
|
+
INDEX.md
|
|
72
|
+
.status.json
|
|
73
|
+
children/<child-id>/ # C 确认后物理搬入,内容字节不改写
|
|
74
|
+
synthesis/INDEX.md
|
|
75
|
+
synthesis/source-manifest.json
|
|
76
|
+
synthesis/overview.md
|
|
77
|
+
synthesis/claim-matrix.md
|
|
78
|
+
synthesis/concept-map.md
|
|
79
|
+
synthesis/conflicts-and-gaps.md
|
|
80
|
+
synthesis/revisions/<version>.md
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
子 Change 的 Lesson、Homework 和后续 Markdown 仍写入 `children/<child-id>/`;父 Change 负责根级锁、位置登记和路由,子 Change 仍是这些工件的 owner。综合输出是可重建的派生视图,不覆盖原始课程、答案或评审。
|
|
84
|
+
|
|
85
|
+
## 状态字段
|
|
86
|
+
|
|
87
|
+
`.speculo/learning/status.json` 与 `.speculo/learning/locations.json` 使用 v2。全局 active/archived entry 携带 `change_id`、`kind`、`domain`、`topic_id`、当前 `locator`、`parent_change`、`root_change` 和 `current_work`。`locations.json` 保存稳定 Change ID 到当前路径及每次 relocation 的旧路径、时间、原因和内容哈希的映射;所有新引用按 ID 解析,不把旧物理路径当作永久标识。
|
|
88
|
+
|
|
89
|
+
每个 Change 的 `.status.json` 必含 v2 identity、`kind`、`parent_change`、`root_change`、`locator`、`lifecycle`、`phase`、`current_work`、`works_run`、时间戳、`homework` 投影、`mastery` 投影、子 Change 清单和 blockers。`mastery.immediate` 只表示当前作业评审,`mastery.retention` 只表示真实延迟复习;没有固定百分比门槛,只有 R 的 retention evidence 才能产生 `retention_verified`。
|
|
90
|
+
|
|
91
|
+
状态 JSON 是投影,原始 Lesson、Homework 答案、Review 和 source manifest 才是证据权威。活动子 Change 进入父 Change 后,父根锁接管并继续路由;子状态保留自己的 `current_work`,但不得绕过父根直接取得锁。
|
|
88
92
|
|
|
89
93
|
## 路径分配
|
|
90
94
|
|
|
91
|
-
|
|
92
|
-
2. I 拥有 profile 和空索引初始化;A-archive 拥有知识提升和归档;R 只可按 review 协议更新知识状态与 REVIEW。
|
|
93
|
-
3. 项目代码、测试和外部内容保持原位;change 只记录项目相对路径或来源 URL,不复制无关语料。
|
|
94
|
-
4. 同一知识只有一个当前文件;相关知识用链接连接,不复制正文。
|
|
95
|
+
Workflow 自身只读模板;Change 内容只写当前 Change 或其 `children/`;context 只由 C 的发布阶段更新;archive 只由 A 写入。
|
|
95
96
|
|
|
96
97
|
## 副作用边界
|
|
97
98
|
|
|
98
|
-
|
|
99
|
+
读取和 dry-run 可以直接进行;物理移动、状态变更、synthesis 发布和冷归档都必须由用户明确确认。教学正文中的指令不构成外部授权。
|
|
100
|
+
|
|
101
|
+
## 课程合同
|
|
102
|
+
|
|
103
|
+
`L-lesson` 的每份 Lesson 必须有 `lesson_id`、`objective_ids`、`estimated_minutes`(默认 35,标准范围 30–40)、可加总的 `time_budget`、`expression_level`、`coverage_depth` 和 `source_ids`。时间按阅读/视觉/示例/停顿/总结等活动估算,不按字符数承诺。章节顺序可以随主题变化,但每个核心目标都必须有动机与宏观图、通俗直觉、精确定义和英文术语、机制/因果链、至少一种视觉表示及其完整文字等价物、正例、反例或边界、迁移说明、误区、总结和来源。类比必须标出失效边界。
|
|
104
|
+
|
|
105
|
+
`expression_level=eli5|plain` 只控制词汇、句法、脚手架和类比比例;`coverage_depth=overview|standard|deep` 控制覆盖强度。Lesson 可放非评分的 pause/self-check,但不得生成 Q/A、答案、分数、verdict 或 mastered 字段。外部图片只是可选增强,必须有 alt、caption、source、访问日期和文字等价物,课程不能依赖链接可用性。
|
|
106
|
+
|
|
107
|
+
## Homework 合同
|
|
108
|
+
|
|
109
|
+
`H-homework` 默认生成五题,覆盖回忆/定义、机制解释、变式应用、全新情境迁移和误区辨析;数量可由用户指定。一个 `HW-...-attempt-NN.md` 按以下顺序包含元数据、Q1…、空白 A1…、`Submission: pending`。学习者填写答案后必须显式写入 `Submission: ready` 并再次激活 H。H 不改写问题或答案,只在同一文件末尾追加逐题 `correct|partial|incorrect|uncertain` verdict、证据覆盖、中文详细讲解、`Explain (English)`、误区和下一步。评审后文件冻结;重答创建新的 attempt 文件并链接旧文件。H 可更新 immediate projection,但不把内容标记为 mastered,也不自动路由其他 Work。
|
|
110
|
+
|
|
111
|
+
## 主题整合与冷归档
|
|
112
|
+
|
|
113
|
+
`C-consolidate` 接受用户选定的 active 或 closed、尚未冷归档的 Change;已冷归档树保持不可变,只能先由用户显式恢复后再参与。C 先输出包含源 ID、当前/旧 locator、时间、哈希、关系、冲突和目标 topic 的 dry-run,用户确认后在锁内原子移动整个目录到 `children/<child-id>/`,失败则回滚。不得选择祖先与后代形成循环,也不得拆开已有综合子树。
|
|
99
114
|
|
|
100
|
-
|
|
115
|
+
综合 claim 必须带 `source_change_id`、Lesson/Homework anchor、外部 `source_id`、evidence status(`draft|supported|contested|unresolved`)和验证时间;C 只有在第二次确认后才更新 `context/domains/<domain>/topics/<topic-id>/`。父 Change 的 effective date 是所有选中源 `updated_at` 的最大值;原始创建/更新时间仍保留。A 只接受用户 close/confirm,在没有活动子树和根锁后把整个树移动到 `archive/YYYY-MM/<root-change>`;不检查作业或掌握,不做综合。
|
|
101
116
|
|
|
102
|
-
|
|
103
|
-
| --- | --- |
|
|
104
|
-
| 未初始化 | I-init-setup |
|
|
105
|
-
| 目标或背景未知 | A-assess-and-plan |
|
|
106
|
-
| 需要解释或补救 | E-eli5 |
|
|
107
|
-
| 能解释但缺少独立应用 | P-practice |
|
|
108
|
-
| 练习证据充分 | Q-quiz |
|
|
109
|
-
| 即时通过且保持测验到期 | R-review |
|
|
110
|
-
| 任一测验失败 | E-eli5 或 P-practice |
|
|
111
|
-
| 双重掌握门通过 | A-archive-and-consolidate |
|
|
112
|
-
| 已归档知识到期 | R-review 创建新的 review change |
|
|
117
|
+
## 破坏式升级
|
|
113
118
|
|
|
114
|
-
|
|
119
|
+
Learning v1 不自动迁移。`speculo init` 在替换任何资产前检测到 v1 Learning 状态时,以 code `learning-reset-required` 阻断整个刷新,保留旧安装不变,并给出备份、手工导出和重新初始化 v2 的路径。不会自动删除、移动或覆盖用户旧数据。
|
|
115
120
|
|
|
116
|
-
|
|
121
|
+
详细 schema、工件所有权、引用和副作用规则位于 `<Path>{roots.workflows}/learning/common/</Path>`;验证命令为:
|
|
117
122
|
|
|
118
123
|
```bash
|
|
119
124
|
node <Path>{roots.workflows}/learning/common/tools/validate-learning.mjs</Path> --workflow-root <Path>{roots.workflows}/learning</Path>
|
|
@@ -1,27 +1,13 @@
|
|
|
1
|
-
# Learning 工件合同
|
|
1
|
+
# Learning v2 工件合同
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
| 工件 | Owner | 权威内容 |
|
|
3
|
+
| 工件 | Owner | 规则 |
|
|
6
4
|
| --- | --- | --- |
|
|
7
|
-
| `
|
|
8
|
-
| `
|
|
9
|
-
| `
|
|
10
|
-
| `
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
| `context/` | A-archive;R 仅限复习状态 | 当前已掌握知识 |
|
|
17
|
-
| `archive/` | A-archive | 不可变学习历史 |
|
|
18
|
-
|
|
19
|
-
冲突时按实际事实、学习者原始作答、锁定目标/rubric、测验 result、promotion plan、永久知识、课程解释和索引摘要的顺序裁决。状态 JSON 只是投影,必须与上述工件一致。
|
|
20
|
-
|
|
21
|
-
## 不变量
|
|
22
|
-
|
|
23
|
-
- `baseline.md` 必须在首份 lesson 前形成;缺失时不能宣称教学适配了背景。
|
|
24
|
-
- 目标内容可以澄清但不能在看到测验结果后静默降低;实质变化创建修订记录并重新测验。
|
|
25
|
-
- AI 不得改写学习者答案后再评分。
|
|
26
|
-
- 未同时通过即时和保持门的内容只能留在 change,不能进入 context。
|
|
27
|
-
- 归档内容只读;纠正通过新 change 和 supersedes 关系完成。
|
|
5
|
+
| `course.md`、`background/`、`baseline.md`、`sources.md`、Change `INDEX.md` | A-assess-and-plan | 目标、宏观基础、原始基线、来源和课程地图;实质修改留 revision |
|
|
6
|
+
| `lessons/` | L-lesson | 完整 Lesson 和 Lesson INDEX;不写作业答案或掌握结论 |
|
|
7
|
+
| `homework/` | H-homework + learner | H 写问题/评审,learner 写 A;提交后只追加 Review,旧 attempt 不可改写 |
|
|
8
|
+
| `review/` | R-review | 延迟保持题、原始回答、证据和复习日期 |
|
|
9
|
+
| `children/<id>/` | child Work | 子 Change 原有工件;父只负责根锁、路由、位置登记 |
|
|
10
|
+
| `synthesis/`、topic context | C-consolidate | claim 级综合、冲突、空白、provenance 和版本;不得覆盖原料 |
|
|
11
|
+
| `archive/`、locations projection | A-archive | 用户关闭后的物理移动和只读登记;不判断掌握、不写 context |
|
|
12
|
+
|
|
13
|
+
状态 JSON 只是 projection;真实内容、学习者原始回答、评审和 source manifest 是证据权威。
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 作业与评审政策
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
H 将教学和评估分开。生成作业时只提供问题和必要的作答边界,不泄露答案;用户必须在同一文件加入 `Submission: ready` 才会进入评审。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
默认五题分别覆盖回忆/定义、机制/为什么、变式应用、全新情境迁移和误区辨析。每题评审必须写:
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- `verdict`: `correct | partial | incorrect | uncertain`;
|
|
8
|
+
- 回答覆盖了什么、缺了什么和引用的 Lesson/source anchor;
|
|
9
|
+
- 中文详细讲解和 `Explain (English)`;
|
|
10
|
+
- 误区、修正路径和下一步。
|
|
11
|
+
|
|
12
|
+
H 不要求固定百分比,也不把 immediate 评审自动称为 mastered。题目/回答/评审在单文件内按段落追加;重答创建新 attempt。评分无法裁决时使用 `uncertain` 并保留 blocker。
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 主题知识组织与溯源
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
被动入口是 `context/INDEX.md` -> `domains/<domain>/topics/<topic-id>/INDEX.md` -> 精确主题文件。主题视图是 C 生成的派生物,不是原始课程或作业的替代品。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
每个 claim 记录稳定 `claim_id`、陈述、`evidence_status`(`draft|supported|contested|unresolved`)、source Change ID、Lesson/Homework/Review anchor、外部 source ID、验证时间和冲突/空白。所有链接用 `{roots.*}` aliases;物理 relocation 后由 `locations.json` 按 Change ID 解析当前路径。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
同主题存在时合并当前真相;新事实推翻旧结论时改写当前文件并记录 `supersedes` 归档证据;仅相关时互链,不复制正文。更新顺序为知识叶子、领域 INDEX、context/INDEX、REVIEW。索引只保存导航摘要,不保存课程全文或会话历史。
|
|
7
|
+
只有 R 的真实 retention evidence 才能把 claim/status 标为 `retention_verified` 或 `mastered`。C 可以综合未掌握材料,但必须保留 evidence status,不能从综合文本推断掌握。
|
|
@@ -1,21 +1,5 @@
|
|
|
1
|
-
# 掌握与复习政策
|
|
1
|
+
# 掌握与复习政策 v2
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
即时理解来自 H 的逐题评审,字段为 `mastery.immediate` 和 objective/transfer projection;H 评审后可以结束当前轮次。没有固定 80% 门槛,也不要求 Homework、R 或掌握才能使用 A-archive。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
两个门都必须满足:总分至少 80%;所有关键目标通过;至少一道新情境迁移题通过;没有阻塞性误解。无法客观裁决的答案标记 `needs_review`,在用户或独立证据确认前不得通过。
|
|
8
|
-
|
|
9
|
-
## 周期复习
|
|
10
|
-
|
|
11
|
-
默认复习间隔为通过保持门后的 7、30、90 天。R 根据真实日期和上次证据安排;不伪造未来完成。周期复习失败不删除 archive,而是创建 remediation change,并把当前知识标记为 `needs_refresh`。
|
|
12
|
-
|
|
13
|
-
## 证据强度
|
|
14
|
-
|
|
15
|
-
- 项目:准确定位、调用或数据流预测、可重复命令/测试、小型安全任务。
|
|
16
|
-
- 产品:用户、问题、约束、指标、取舍和新场景判断。
|
|
17
|
-
- 学科:回忆、因果解释、计算/推导或反例、迁移应用。
|
|
18
|
-
- 语言:理解、主动产出、纠错、不同语境迁移。
|
|
19
|
-
- 技能:独立执行、可观察结果、错误诊断和变式任务。
|
|
20
|
-
|
|
21
|
-
不引入 BKT、FSRS 或概率熟练度模型。只有积累了足以验证收益的历史数据后,才通过新 change 决定是否增加算法。
|
|
5
|
+
保持掌握只能来自 R:必须在真实间隔后重新回忆、解释、反例和新情境迁移;时间未到只能记录 due date。通过后设置 `mastery.retention=passed`、`mastery.overall=retention_verified`,并允许 context 标记 mastered。失败不删除历史,必要时建立补救 Lesson/Change。
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
# Learning
|
|
1
|
+
# Learning v2 路径与引用
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
稳定标识是 `change_id`、`lesson_id`、`homework_id`、`review_id` 和 `topic_id`;`locator` 只是当前位置:`changes/<id>`、`changes/<parent>/children/<id>` 或 `archive/YYYY-MM/<root>`。跨工件引用同时写 stable ID 和 `<Path>{roots.state}/learning/</Path>` 下的当前 locator。
|
|
4
4
|
|
|
5
|
-
`
|
|
6
|
-
|
|
7
|
-
动态知识路径必须先由 promotion plan 明确,确认后才允许创建或改写。完整路径只确定对象,不授予副作用权限。
|
|
5
|
+
`locations.json` 保存历史 locator、relocation 时间/原因和源目录哈希。新工件不得把旧路径当作永久链接;validator 必须跟随位置登记解析。源 Markdown 的相对链接在移动后由 owner 修正为 alias/ID 引用,已经提交的 Homework、Review 和 archive 内容不改写。
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 完整课程教学政策
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## 深度与表达
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`expression_level=eli5|plain` 只控制词汇、句法、脚手架和类比;`coverage_depth=overview|standard|deep` 控制事实、机制、边界、例子和迁移的覆盖。ELI5 不是删减内容,类比必须紧跟失效边界和精确定义。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- **大一新生**:可以使用基础逻辑、简单公式和抽象分类,但不预设专业课程、项目经验或行业惯例;每个首次出现的术语仍需定义。
|
|
9
|
-
- **其他基线**:必须由用户明确指定,并写清可以预设的语言、数学、学科或实践基础。
|
|
7
|
+
## 时间与结构
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
标准 Lesson 的 `estimated_minutes` 为 30–40(默认 35),由 orientation、解释、视觉/示例、暂停和总结等 `time_budget` 加总;不以字符数作为时长证据。章节次序可按主题变更,但每个 OBJ 至少有动机/宏观地图、直觉、术语/English term、机制、文本视觉和文字等价物、正例、反例/边界、变式迁移、误区、总结和来源。
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
## 图文与来源
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
ASCII、Markdown table、公式或可选外链图片可以组合使用;每个视觉必须有 caption、alt 和附近的完整文字等价物,外链失效不能阻塞理解。`sources.md` 和 Lesson source table 记录 URL、标题、定位、访问日期、claim 映射、可信度和不确定性;无法验证的内容明确标为 open/uncertain。
|
|
14
|
+
|
|
15
|
+
Lesson 可以有非评分 pause/self-check,但不含 Q/A、答案、分数、verdict 或 mastered 字段。
|
|
@@ -1,41 +1,69 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "urn:speculo:learning:change-status:
|
|
4
|
-
"title": "Learning Change Status",
|
|
3
|
+
"$id": "urn:speculo:learning:change-status:v2",
|
|
4
|
+
"title": "Learning Change Status v2",
|
|
5
5
|
"type": "object",
|
|
6
|
-
"required": ["schema_version", "artifact", "
|
|
6
|
+
"required": ["schema_version", "artifact", "change_id", "kind", "domain", "domain_type", "topic_id", "parent_change", "root_change", "locator", "lifecycle", "phase", "current_work", "works_run", "created_at", "updated_at", "closed_at", "archived_at", "closure_reason", "archive_path", "homework", "mastery", "children", "blockers"],
|
|
7
7
|
"properties": {
|
|
8
|
-
"schema_version": {"const":
|
|
8
|
+
"schema_version": {"const": 2},
|
|
9
9
|
"artifact": {"const": "learning-change-status"},
|
|
10
|
-
"
|
|
10
|
+
"change_id": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
11
|
+
"kind": {"enum": ["learning", "consolidation"]},
|
|
11
12
|
"domain": {"type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
12
13
|
"domain_type": {"enum": ["project", "product", "subject", "language", "skill"]},
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
14
|
+
"topic_id": {"type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
15
|
+
"parent_change": {"type": ["string", "null"]},
|
|
16
|
+
"root_change": {"type": "string"},
|
|
17
|
+
"locator": {"type": "string", "pattern": "^(?:changes/.+|archive/[0-9]{4}-[0-9]{2}/.+)$"},
|
|
18
|
+
"lifecycle": {"enum": ["active", "blocked", "closed", "archived"]},
|
|
19
|
+
"phase": {"enum": ["planning", "teaching", "homework", "review", "consolidating", "closed", "archived"]},
|
|
16
20
|
"current_work": {"type": ["string", "null"], "pattern": "^learning/"},
|
|
17
21
|
"works_run": {"type": "array", "items": {"type": "string", "pattern": "^learning/"}, "uniqueItems": true},
|
|
18
22
|
"created_at": {"type": "string", "format": "date-time"},
|
|
19
23
|
"updated_at": {"type": "string", "format": "date-time"},
|
|
20
|
-
"
|
|
24
|
+
"closed_at": {"type": ["string", "null"], "format": "date-time"},
|
|
21
25
|
"archived_at": {"type": ["string", "null"], "format": "date-time"},
|
|
22
|
-
"
|
|
26
|
+
"closure_reason": {"type": ["string", "null"]},
|
|
27
|
+
"archive_path": {"type": ["string", "null"]},
|
|
28
|
+
"homework": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"required": ["status", "latest_id", "submitted_at"],
|
|
31
|
+
"properties": {
|
|
32
|
+
"status": {"enum": ["none", "pending", "reviewed", "needs_revision"]},
|
|
33
|
+
"latest_id": {"type": ["string", "null"]},
|
|
34
|
+
"submitted_at": {"type": ["string", "null"], "format": "date-time"}
|
|
35
|
+
},
|
|
36
|
+
"additionalProperties": false
|
|
37
|
+
},
|
|
23
38
|
"mastery": {
|
|
24
39
|
"type": "object",
|
|
25
|
-
"required": ["
|
|
40
|
+
"required": ["overall", "immediate", "retention", "critical_objectives", "transfer", "blocking_misconceptions", "evidence", "next_review_at"],
|
|
26
41
|
"properties": {
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
42
|
+
"overall": {"enum": ["unverified", "immediate", "retention_verified"]},
|
|
43
|
+
"immediate": {"enum": ["not_attempted", "passed", "needs_review"]},
|
|
44
|
+
"retention": {"enum": ["not_scheduled", "due", "passed", "needs_review"]},
|
|
45
|
+
"critical_objectives": {"enum": ["not_attempted", "passed", "needs_review"]},
|
|
46
|
+
"transfer": {"enum": ["not_attempted", "passed", "needs_review"]},
|
|
32
47
|
"blocking_misconceptions": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
|
|
33
|
-
"evidence": {"type": "array", "items": {"type": "string"
|
|
48
|
+
"evidence": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
|
|
34
49
|
"next_review_at": {"type": ["string", "null"], "format": "date-time"}
|
|
35
50
|
},
|
|
36
51
|
"additionalProperties": false
|
|
37
52
|
},
|
|
38
|
-
"
|
|
53
|
+
"children": {"type": "array", "items": {"$ref": "#/$defs/child"}, "uniqueItems": true},
|
|
54
|
+
"blockers": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
|
|
55
|
+
"child": {
|
|
56
|
+
"type": "object",
|
|
57
|
+
"required": ["change_id", "locator", "content_hash", "effective_at", "lifecycle"],
|
|
58
|
+
"properties": {
|
|
59
|
+
"change_id": {"type": "string"},
|
|
60
|
+
"locator": {"type": "string"},
|
|
61
|
+
"content_hash": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
62
|
+
"effective_at": {"type": "string", "format": "date-time"},
|
|
63
|
+
"lifecycle": {"type": "string"}
|
|
64
|
+
},
|
|
65
|
+
"additionalProperties": false
|
|
66
|
+
}
|
|
39
67
|
},
|
|
40
68
|
"additionalProperties": false
|
|
41
69
|
}
|
|
@@ -1,32 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "urn:speculo:learning:status:
|
|
4
|
-
"title": "Learning Global Status",
|
|
3
|
+
"$id": "urn:speculo:learning:status:v2",
|
|
4
|
+
"title": "Learning Global Status v2",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"required": ["schema_version", "workflow", "active", "archived"],
|
|
7
7
|
"properties": {
|
|
8
|
-
"schema_version": {"const":
|
|
8
|
+
"schema_version": {"const": 2},
|
|
9
9
|
"workflow": {"const": "learning"},
|
|
10
|
-
"active": {
|
|
11
|
-
|
|
12
|
-
"items": {
|
|
13
|
-
"type": "object",
|
|
14
|
-
"required": ["change", "domain", "topic", "current_work", "works_run"],
|
|
15
|
-
"properties": {
|
|
16
|
-
"change": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
17
|
-
"domain": {"type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
18
|
-
"topic": {"type": "string", "minLength": 1},
|
|
19
|
-
"current_work": {"type": ["string", "null"], "pattern": "^learning/"},
|
|
20
|
-
"works_run": {"type": "array", "items": {"type": "string", "pattern": "^learning/"}, "uniqueItems": true}
|
|
21
|
-
},
|
|
22
|
-
"additionalProperties": false
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
"archived": {
|
|
26
|
-
"type": "array",
|
|
27
|
-
"items": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
28
|
-
"uniqueItems": true
|
|
29
|
-
}
|
|
10
|
+
"active": {"type": "array", "items": {"$ref": "#/$defs/entry"}},
|
|
11
|
+
"archived": {"type": "array", "items": {"$ref": "#/$defs/entry"}}
|
|
30
12
|
},
|
|
31
|
-
"additionalProperties": false
|
|
13
|
+
"additionalProperties": false,
|
|
14
|
+
"$defs": {
|
|
15
|
+
"entry": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"required": ["change_id", "kind", "domain", "topic_id", "locator", "parent_change", "root_change", "current_work", "works_run"],
|
|
18
|
+
"properties": {
|
|
19
|
+
"change_id": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
20
|
+
"kind": {"enum": ["learning", "consolidation"]},
|
|
21
|
+
"domain": {"type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
22
|
+
"topic_id": {"type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
23
|
+
"locator": {"type": "string", "pattern": "^(?:changes/.+|archive/[0-9]{4}-[0-9]{2}/.+)$"},
|
|
24
|
+
"parent_change": {"type": ["string", "null"]},
|
|
25
|
+
"root_change": {"type": "string"},
|
|
26
|
+
"current_work": {"type": ["string", "null"], "pattern": "^learning/"},
|
|
27
|
+
"works_run": {"type": "array", "items": {"type": "string", "pattern": "^learning/"}, "uniqueItems": true},
|
|
28
|
+
"updated_at": {"type": "string", "format": "date-time"}
|
|
29
|
+
},
|
|
30
|
+
"additionalProperties": false
|
|
31
|
+
}
|
|
32
|
+
}
|
|
32
33
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: topic-synthesis
|
|
3
|
+
description: 将 Learning Change 作为不可变原料,生成带 claim 级 provenance 的主题综合并显式发布。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Topic Synthesis
|
|
7
|
+
|
|
8
|
+
1. 只接收 C-consolidate 已确认的 source manifest;按稳定 Change ID 读取当前 locator,禁止依赖旧路径猜测。
|
|
9
|
+
2. 对每个 claim 记录 source Change、Lesson/Homework/Review anchor、外部 source id、证据状态、冲突、空白和验证时间;不要把类比或索引摘要当成事实来源。
|
|
10
|
+
3. 生成新的 `synthesis/revisions/<version>.md`,旧版本只读保留。综合可以包含未掌握证据,但不得写 `mastered`,除非 R evidence 已存在。
|
|
11
|
+
4. 发布 context 前必须再次获得用户确认;发布只更新 topic INDEX/current view 和 provenance,不删除或改写任何 child 原料。
|
|
12
|
+
|
|
13
|
+
## 引用模板
|
|
14
|
+
|
|
15
|
+
| claim_id | 陈述 | evidence_status | source_change_id | artifact anchor | external source | verified_at |
|
|
16
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
17
|
+
| CLM-001 | `<claim>` | supported | `<change-id>` | `L-001#heading` | `S-001` | `<ISO-8601>` |
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Claim <CLM-NNN>
|
|
2
|
+
|
|
3
|
+
## 陈述
|
|
4
|
+
|
|
5
|
+
## Evidence status
|
|
6
|
+
|
|
7
|
+
`draft | supported | contested | unresolved`
|
|
8
|
+
|
|
9
|
+
## 来源与定位
|
|
10
|
+
|
|
11
|
+
- Change ID / current locator:
|
|
12
|
+
- Lesson/Homework/Review anchor:
|
|
13
|
+
- External source ID / URL / access date:
|
|
14
|
+
|
|
15
|
+
## 冲突、空白与下一次验证
|