@yottameta/yotta-lesson 0.0.0 → 0.1.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/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/NOTICE +12 -0
- package/README.md +156 -0
- package/README.zh-CN.md +148 -0
- package/SKILL.md +87 -0
- package/assets/banner.png +0 -0
- package/bin/install.js +163 -0
- package/install.sh +132 -0
- package/package.json +35 -9
- package/references/copyright.md +34 -0
- package/references/map-format.md +88 -0
- package/references/plan-format.md +61 -0
- package/scripts/yotta_lesson.py +653 -0
package/install.sh
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# yotta-lesson 多智能体安装脚本(YottaSkills 模板)
|
|
3
|
+
# 用法:
|
|
4
|
+
# bash install.sh --agent <name> # 按智能体默认用户级目录安装
|
|
5
|
+
# bash install.sh --dir <path> # 装到指定目录(用户改过目录的智能体)
|
|
6
|
+
# bash install.sh -g # 装到全部已知智能体用户级目录
|
|
7
|
+
# bash install.sh # 检测并安装到已存在的项目级目录
|
|
8
|
+
# bash install.sh --list # 列出智能体 -> 默认目录
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
SKILL_NAME="yotta-lesson"
|
|
12
|
+
SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
|
+
case "$(uname -s)" in
|
|
14
|
+
MINGW*|MSYS*)
|
|
15
|
+
SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W)"
|
|
16
|
+
;;
|
|
17
|
+
esac
|
|
18
|
+
|
|
19
|
+
# 智能体 -> 用户级默认目录(--agent 装到第一个)
|
|
20
|
+
# .agents/skills 并非通用目录:OpenCode / Cursor / Cline / Amp / Kimi / Gemini CLI / GitHub Copilot 读取。
|
|
21
|
+
# 判断当前环境:Windows Git Bash 用 %USERPROFILE%,Unix 用 ~
|
|
22
|
+
_IS_WINDOWS=0
|
|
23
|
+
case "$(uname -s)" in
|
|
24
|
+
MINGW*|MSYS*|CYGWIN*) _IS_WINDOWS=1 ;;
|
|
25
|
+
esac
|
|
26
|
+
dirs_for() {
|
|
27
|
+
case "$1" in
|
|
28
|
+
claude) echo ".claude/skills" ;;
|
|
29
|
+
cursor) echo ".cursor/skills .agents/skills" ;;
|
|
30
|
+
codex) echo "__CODEX__" ;;
|
|
31
|
+
gemini) echo ".gemini/skills .agents/skills" ;;
|
|
32
|
+
goose) echo ".config/goose/skills .agents/skills" ;;
|
|
33
|
+
amp) echo ".config/agents/skills .agents/skills" ;;
|
|
34
|
+
opencode) echo "__OPENCODE__" ;;
|
|
35
|
+
windsurf) echo ".codeium/windsurf/skills" ;;
|
|
36
|
+
workbuddy) echo ".workbuddy/skills" ;;
|
|
37
|
+
kiro) echo ".kiro/skills" ;;
|
|
38
|
+
trae) echo ".traecli/skills" ;;
|
|
39
|
+
trae-cn) echo ".trae-cn/skills" ;;
|
|
40
|
+
qwen) echo ".qwen/skills" ;;
|
|
41
|
+
comate) echo ".comate/skills" ;;
|
|
42
|
+
codebuddy) echo ".codebuddy/skills" ;;
|
|
43
|
+
kimi) echo ".kimi/skills" ;;
|
|
44
|
+
agents) echo ".agents/skills" ;;
|
|
45
|
+
*) return 1 ;;
|
|
46
|
+
esac
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
codex_dir() {
|
|
50
|
+
if [ -n "${CODEX_HOME:-}" ]; then printf '%s' "$CODEX_HOME/skills"; else printf '%s' "$HOME/.codex/skills"; fi
|
|
51
|
+
}
|
|
52
|
+
opencode_dir() {
|
|
53
|
+
if [ -n "${XDG_CONFIG_HOME:-}" ]; then printf '%s' "$XDG_CONFIG_HOME/opencode/skills"; else printf '%s' "$HOME/.config/opencode/skills"; fi
|
|
54
|
+
}
|
|
55
|
+
resolve_user() {
|
|
56
|
+
case "$1" in
|
|
57
|
+
__CODEX__) codex_dir ;;
|
|
58
|
+
__OPENCODE__) opencode_dir ;;
|
|
59
|
+
*) printf '%s' "$HOME/$1" ;;
|
|
60
|
+
esac
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
install_to() {
|
|
64
|
+
mkdir -p "$1/$SKILL_NAME"
|
|
65
|
+
cp -r "$SOURCE_DIR/." "$1/$SKILL_NAME/"
|
|
66
|
+
rm -rf "$1/$SKILL_NAME/.git"
|
|
67
|
+
echo "installed -> $1/$SKILL_NAME"
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
list() {
|
|
71
|
+
echo "智能体 -> 默认技能目录(--agent <name> 装到第一个,用户级):"
|
|
72
|
+
for a in claude cursor codex gemini goose amp opencode windsurf workbuddy kiro trae trae-cn qwen comate codebuddy kimi agents; do
|
|
73
|
+
local dirs first
|
|
74
|
+
dirs="$(dirs_for "$a")"
|
|
75
|
+
first="${dirs%% *}"
|
|
76
|
+
case "$first" in
|
|
77
|
+
__CODEX__) first=".codex/skills" ;;
|
|
78
|
+
__OPENCODE__) first=".config/opencode/skills" ;;
|
|
79
|
+
esac
|
|
80
|
+
if [ "$_IS_WINDOWS" = "1" ]; then
|
|
81
|
+
first="%USERPROFILE%\\${first//\//\\}"
|
|
82
|
+
else
|
|
83
|
+
first="~/$first"
|
|
84
|
+
fi
|
|
85
|
+
printf ' %-10s %s\n' "$a" "$first"
|
|
86
|
+
done
|
|
87
|
+
echo '说明:Windows 用 %USERPROFILE%,Linux/macOS 用 ~;仅收录有官方默认目录的智能体。'
|
|
88
|
+
echo '改了目录的请用 --dir <路径>,不要依赖默认位置;若设置了 CODEX_HOME / XDG_CONFIG_HOME,安装自动以该变量为准。'
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
main() {
|
|
92
|
+
local agent="" dir="" global=0 show_list=0
|
|
93
|
+
while [ $# -gt 0 ]; do
|
|
94
|
+
case "$1" in
|
|
95
|
+
--agent) shift; agent="${1:-}" ;;
|
|
96
|
+
--dir) shift; dir="${1:-}" ;;
|
|
97
|
+
-g|--global) global=1 ;;
|
|
98
|
+
--list|-l) show_list=1 ;;
|
|
99
|
+
*) echo "未知参数: $1" >&2; exit 2 ;;
|
|
100
|
+
esac
|
|
101
|
+
shift
|
|
102
|
+
done
|
|
103
|
+
|
|
104
|
+
if [ "$show_list" = "1" ]; then list; return; fi
|
|
105
|
+
if [ -n "$dir" ]; then install_to "$dir"; echo "完成。"; return; fi
|
|
106
|
+
if [ -n "$agent" ]; then
|
|
107
|
+
local dirs first
|
|
108
|
+
if ! dirs="$(dirs_for "$agent")"; then
|
|
109
|
+
echo "未收录智能体: $agent。请用 --dir <路径> 指定技能目录。" >&2; exit 2
|
|
110
|
+
fi
|
|
111
|
+
first="${dirs%% *}"
|
|
112
|
+
install_to "$(resolve_user "$first")"; echo "完成。"; return
|
|
113
|
+
fi
|
|
114
|
+
if [ "$global" = "1" ]; then
|
|
115
|
+
echo "安装到全部已知智能体用户级目录..."
|
|
116
|
+
local dirs rel
|
|
117
|
+
for a in claude cursor codex gemini goose amp opencode windsurf workbuddy kiro trae trae-cn qwen comate codebuddy kimi agents; do
|
|
118
|
+
dirs="$(dirs_for "$a")"
|
|
119
|
+
for rel in $dirs; do install_to "$(resolve_user "$rel")"; done
|
|
120
|
+
done
|
|
121
|
+
echo "完成。"; return
|
|
122
|
+
fi
|
|
123
|
+
local installed=0 d
|
|
124
|
+
for d in .claude/skills .cursor/skills .codex/skills .config/goose/skills .config/agents/skills .opencode/skills .codeium/windsurf/skills .workbuddy/skills .kiro/skills .traecli/skills .gemini/skills .trae-cn/skills .qwen/skills .comate/skills .codebuddy/skills .kimi/skills .agents/skills; do
|
|
125
|
+
if [ -d "$d" ]; then install_to "$d"; installed=1; fi
|
|
126
|
+
done
|
|
127
|
+
if [ "$installed" = "0" ]; then
|
|
128
|
+
echo "未检测到项目级智能体目录。可用 --agent <name> / -g 装到用户级,或 --dir 指定。"
|
|
129
|
+
fi
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
main "$@"
|
package/package.json
CHANGED
|
@@ -1,19 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yottameta/yotta-lesson",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
-
},
|
|
9
|
-
"keywords": [],
|
|
10
|
-
"author": "",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "YuanAn (yotta-lesson) — a local, deterministic lesson-plan skeleton and coverage checker for AI agents: reads a curriculum map (lesson id, knowledge points, key points, difficulties, misconceptions, standard reference) plus an optional structure config, builds a lesson skeleton whose stage minutes always sum to periods x minutes-per-period and whose objectives each carry a curriculum-standard source, and checks an existing lesson text for missing knowledge points, missing required stages, missing citations, missing time annotations and total-time mismatches. Markdown and JSON output, configurable stages, and a CI gate are included. Triggers: drafting a lesson or study-plan skeleton, verifying a lesson against a curriculum map, checking that knowledge points and stages are covered, or wiring lesson-structure checks into automation. Boundaries: structural skeleton and gap list only — no exercise content, no student comments, no replacement for the teacher's instructional design; no network access, no model calls, no upload of lesson plans or school maps; no textbook, curriculum or exam text is bundled, and citations must be verified against official sources. Fully local, zero-dependency (Python 3.8+ standard library).",
|
|
11
5
|
"license": "MIT",
|
|
12
|
-
"
|
|
6
|
+
"keywords": [
|
|
7
|
+
"agent-skills",
|
|
8
|
+
"yotta-lesson",
|
|
9
|
+
"yottaskills",
|
|
10
|
+
"lesson-plan",
|
|
11
|
+
"education"
|
|
12
|
+
],
|
|
13
|
+
"files": [
|
|
14
|
+
"SKILL.md",
|
|
15
|
+
"LICENSE",
|
|
16
|
+
"NOTICE",
|
|
17
|
+
"README.md",
|
|
18
|
+
"README.zh-CN.md",
|
|
19
|
+
"CHANGELOG.md",
|
|
20
|
+
"install.sh",
|
|
21
|
+
"references",
|
|
22
|
+
"scripts",
|
|
23
|
+
"assets",
|
|
24
|
+
"bin",
|
|
25
|
+
"!scripts/test_*.py",
|
|
26
|
+
"!scripts/fixtures",
|
|
27
|
+
"!scripts/fixtures/**",
|
|
28
|
+
"!**/__pycache__",
|
|
29
|
+
"!**/*.pyc",
|
|
30
|
+
"!**/*.pyo"
|
|
31
|
+
],
|
|
13
32
|
"repository": {
|
|
33
|
+
"type": "git",
|
|
14
34
|
"url": "git+https://github.com/YottaMeta/yotta-lesson.git"
|
|
15
35
|
},
|
|
16
36
|
"publishConfig": {
|
|
17
37
|
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"bin": {
|
|
40
|
+
"yotta-lesson": "bin/install.js"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"test": "python scripts/test_yotta_lesson.py"
|
|
18
44
|
}
|
|
19
45
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# 版权与使用边界(元案 yotta-lesson)
|
|
2
|
+
|
|
3
|
+
## 一、不含教材与题目原文
|
|
4
|
+
|
|
5
|
+
- 映射包只记录结构性元数据:课题 id / 名称、单元、知识点名称、重难点、易错点、课标条目标识;
|
|
6
|
+
- 本技能不内置、不下载、不缓存教材课文、课标正文、教辅题目与考试真题;
|
|
7
|
+
- 教案骨架中的环节要点为通用教学动作描述,不含具体题目内容;例题与练习的具体内容由教师自行编写或引用合法来源。
|
|
8
|
+
|
|
9
|
+
## 二、课标与来源引用
|
|
10
|
+
|
|
11
|
+
- `standard` 字段要求填写可核对的课标来源标识(如「义务教育数学课程标准(2022 年版)· 方程与不等式」);
|
|
12
|
+
- 引用标注用于**可追溯**,不代表本技能对课标内容作出解释;解读与适用以官方文本和教研判断为准;
|
|
13
|
+
- 若学校对来源写法有规范(如校内编号),可在 `standard` 中按规范书写,`check` 会按该文本核对。
|
|
14
|
+
|
|
15
|
+
## 三、教师责任与免责
|
|
16
|
+
|
|
17
|
+
- 本技能输出的是教案骨架与结构性缺口清单,属于**备课辅助**;
|
|
18
|
+
- 教学目标设定、环节设计、时间取舍、作业布置的最终决定由教师负责;
|
|
19
|
+
- 发布或提交教案前,请教师自行核对知识点表述、来源标注与本校规范;
|
|
20
|
+
- 固定免责声明:本文件由元案(yotta-lesson)基于本地映射包与结构配置的确定性计算生成,
|
|
21
|
+
仅作备课辅助;教学设计与时间安排的最终决定由教师负责,课标引用请以官方文本为准。
|
|
22
|
+
|
|
23
|
+
## 四、数据边界
|
|
24
|
+
|
|
25
|
+
- 本地运行:核心路径零网络、零模型调用;教案草稿、映射包与结构配置只在本机流转;
|
|
26
|
+
- 不产生遥测、不上报、不建远程副本;
|
|
27
|
+
- 若将教研组映射包用于共享,请确认其中不含不宜外传的校本信息(如班级、教师姓名)。
|
|
28
|
+
|
|
29
|
+
## 五、与其他技能的分工
|
|
30
|
+
|
|
31
|
+
- 题目内容生成 / 组卷:属元题(规划中);
|
|
32
|
+
- 学情数据分析:属元镜 yotta-mirror;
|
|
33
|
+
- 含个人信息的材料合规审查:属元规 yotta-compliance;
|
|
34
|
+
- 对外呈现与去 AI 味:属元呈 / 元真。
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# 映射包与结构配置(元案 yotta-lesson)
|
|
2
|
+
|
|
3
|
+
## 一、课标映射包(JSON,必填)
|
|
4
|
+
|
|
5
|
+
```json
|
|
6
|
+
{
|
|
7
|
+
"schema_version": "1.0",
|
|
8
|
+
"subject": "数学",
|
|
9
|
+
"grade": "七年级上",
|
|
10
|
+
"lessons": [
|
|
11
|
+
{
|
|
12
|
+
"id": "L1",
|
|
13
|
+
"title": "认识一元一次方程",
|
|
14
|
+
"unit": "一元一次方程",
|
|
15
|
+
"periods": 1,
|
|
16
|
+
"knowledge": ["一元一次方程的定义", "方程的解"],
|
|
17
|
+
"key_points": ["一元一次方程的定义"],
|
|
18
|
+
"difficulties": ["由实际问题抽象出方程"],
|
|
19
|
+
"misconceptions": ["把含未知数的式子都当方程"],
|
|
20
|
+
"standard": "义务教育数学课程标准(2022 年版)· 方程与不等式"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| `id` | string | 是 | 课题 id,不可重复;`plan` / `check` 用它定位课题 |
|
|
29
|
+
| `title` | string | 是 | 课题名称(进入教案标题) |
|
|
30
|
+
| `unit` | string | 否 | 所属单元 |
|
|
31
|
+
| `periods` | int | 否 | 课时数,默认 1;可用 `--periods` 覆盖 |
|
|
32
|
+
| `knowledge` | string[] | 是 | 知识点(进入学习目标,`check` 逐条核对是否出现在教案中) |
|
|
33
|
+
| `key_points` | string[] | 否 | 教学重点 |
|
|
34
|
+
| `difficulties` | string[] | 否 | 教学难点 |
|
|
35
|
+
| `misconceptions` | string[] | 否 | 易错点(缺省会在备课时提示补充) |
|
|
36
|
+
| `standard` | string | 是 | 课标来源标识(可追溯性必需;请填写可核对的条目标识) |
|
|
37
|
+
|
|
38
|
+
顶层 `subject` / `grade` 会写入骨架信息区,便于同一映射包跨班复用。
|
|
39
|
+
|
|
40
|
+
## 二、结构配置(JSON,可选)
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"schema_version": "1.0",
|
|
45
|
+
"minutes_per_period": 45,
|
|
46
|
+
"stages": [
|
|
47
|
+
{"id": "lead_in", "name": "导入", "ratio": 0.10},
|
|
48
|
+
{"id": "explore", "name": "新知探究", "ratio": 0.30},
|
|
49
|
+
{"id": "explain", "name": "例题精讲", "ratio": 0.25},
|
|
50
|
+
{"id": "practice", "name": "练习巩固", "ratio": 0.25},
|
|
51
|
+
{"id": "summary", "name": "小结与作业", "ratio": 0.10}
|
|
52
|
+
],
|
|
53
|
+
"required_stages": ["lead_in", "explore", "practice", "summary"],
|
|
54
|
+
"check_keywords": {
|
|
55
|
+
"practice": ["练习", "巩固", "变式"],
|
|
56
|
+
"summary": ["小结", "作业", "总结"]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
| 字段 | 说明 |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `minutes_per_period` | 每课时分钟数(不小于 5,默认 45) |
|
|
64
|
+
| `stages` | 环节定义:`id` / `name` / `ratio`(比例为相对权重,不必和为 1) |
|
|
65
|
+
| `required_stages` | 必填环节(`check` 会逐项核对关键词是否出现在教案中) |
|
|
66
|
+
| `check_keywords` | 环节 → 关键词数组;命中任一即认为该环节存在 |
|
|
67
|
+
|
|
68
|
+
时间分配采用**最大余数法**:按比例取整后,把剩余分钟按小数部分从大到小补齐,保证
|
|
69
|
+
各环节分钟合计精确等于 `课时 × 每课时分钟`。
|
|
70
|
+
|
|
71
|
+
## 三、常见报错对照
|
|
72
|
+
|
|
73
|
+
| 提示 | 原因 | 处理 |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| `schema_version 必须是 1.0` | 版本不匹配 | 按模板修正 |
|
|
76
|
+
| `课题 id 重复:L1` | 同一 id 出现两次 | 合并或改名 |
|
|
77
|
+
| `缺少 standard` | 未填课标来源 | 补条目标识(可追溯性必需) |
|
|
78
|
+
| `knowledge 必须是字符串数组` | 类型写错 | 改成数组 |
|
|
79
|
+
| `periods 必须是不小于 1 的整数` | 课时数非法 | 填正整数 |
|
|
80
|
+
| `环节 id 重复` | 结构配置里重复 | 合并环节 |
|
|
81
|
+
| `required_stages 引用了未声明的环节` | 必填环节不在 `stages` 中 | 先声明再引用 |
|
|
82
|
+
| `映射包中不存在课题:L9` | `--lesson` 写错 | 用 `map list` 查看可用 id |
|
|
83
|
+
|
|
84
|
+
## 四、使用建议
|
|
85
|
+
|
|
86
|
+
- 一个映射包对应一个学科一个学期;单元与课题按教材顺序排列;
|
|
87
|
+
- 课标来源建议写「课标名称(版本)· 条目或主题」这种可核对的形式;
|
|
88
|
+
- 结构配置按学校 / 教研组统一维护,教案口径才可比。
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# 骨架与检查报告契约(元案 yotta-lesson)
|
|
2
|
+
|
|
3
|
+
## 一、教案骨架(Markdown)
|
|
4
|
+
|
|
5
|
+
1. 课题信息(学科 / 年级 / 课题 / 课时 × 每课时分钟 = 合计分钟)
|
|
6
|
+
2. 学习目标(逐条带课标来源)
|
|
7
|
+
3. 教学重难点与易错点
|
|
8
|
+
4. 教学环节与时间分配(表格:环节 / 时间 / 要点)
|
|
9
|
+
5. 板书与评价清单(可勾选)
|
|
10
|
+
6. 备课提示(映射包层面需要教师补充的点)
|
|
11
|
+
7. 来源与免责
|
|
12
|
+
|
|
13
|
+
## 二、骨架 JSON 顶层字段(`schema_version = 1.0`)
|
|
14
|
+
|
|
15
|
+
| 字段 | 说明 |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `schema_version` | 契约版本 |
|
|
18
|
+
| `tool` | 固定为 `yotta-lesson` |
|
|
19
|
+
| `tool_version` | 引擎版本 |
|
|
20
|
+
| `generated_at` | 生成时间(UTC,唯一随运行变化的字段) |
|
|
21
|
+
| `lesson` | 课题信息:id / title / unit / subject / grade / periods / minutes_per_period / total_minutes |
|
|
22
|
+
| `objectives` | 学习目标数组(`knowledge` + `source`) |
|
|
23
|
+
| `key_points` | 教学重点 |
|
|
24
|
+
| `difficulties` | 教学难点 |
|
|
25
|
+
| `misconceptions` | 易错点 |
|
|
26
|
+
| `stages` | 环节数组(`id` / `name` / `minutes` / `focus`) |
|
|
27
|
+
| `checklist` | 评价清单(板书、反馈、作业等) |
|
|
28
|
+
| `findings` | 备课提示(映射包层面的缺口,如无易错点、课时被覆盖) |
|
|
29
|
+
| `sources` | 课标来源 |
|
|
30
|
+
| `disclaimer` | 固定免责声明 |
|
|
31
|
+
|
|
32
|
+
## 三、缺口检查报告
|
|
33
|
+
|
|
34
|
+
`check` 子命令对已有教案文本做确定性核对,输出 `findings` 数组(按 `kind` + `detail` 排序):
|
|
35
|
+
|
|
36
|
+
| kind | 含义 | 处理建议 |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `knowledge_missing` | 教案未出现映射包中的知识点原文 | 补知识点或改用映射包认可的名称 |
|
|
39
|
+
| `stage_missing` | 必填环节的关键词都未出现 | 补该环节,或调整 `check_keywords` |
|
|
40
|
+
| `source_missing` | 未标注课标来源 | 在教案中写明 `standard`(至少写明条目前半段) |
|
|
41
|
+
| `time_missing` | 未出现任何「N 分钟」标注 | 给各环节补时间 |
|
|
42
|
+
| `minutes_mismatch` | 标注的「合计 N 分钟」与 课时 × 每课时分钟 不一致 | 核对课时数或时间分配 |
|
|
43
|
+
|
|
44
|
+
检查报告 JSON 顶层字段:`schema_version`、`tool`、`tool_version`、`lesson`、`checked`、
|
|
45
|
+
`findings`、`summary`、`disclaimer`。
|
|
46
|
+
|
|
47
|
+
## 四、退出码与闸门
|
|
48
|
+
|
|
49
|
+
| 退出码 | 含义 |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `0` | 正常(含未触发闸门) |
|
|
52
|
+
| `1` | `--gate findings=<n>`:缺口数量 ≥ n |
|
|
53
|
+
| `2` | 输入错误(文件缺失、教案文本缺失、非法输出路径) |
|
|
54
|
+
| `3` | 映射或配置错误(schema、必填字段、课时数、环节定义) |
|
|
55
|
+
| `4` | 运行时错误(文件系统等) |
|
|
56
|
+
|
|
57
|
+
## 五、复算与归档建议
|
|
58
|
+
|
|
59
|
+
- 归档四件:映射包、结构配置、教案骨架 JSON、教案正文;四件齐全才能复算同一结论;
|
|
60
|
+
- 教研组比对教案时,固定同一映射包与结构配置,差异才归因于教案本身;
|
|
61
|
+
- 骨架的 `findings` 与 `check` 的 `findings` 含义不同:前者是映射包层面的备课提示,后者是教案文本层面的缺口。
|