高校期末教学资料与课程归档规范性核查
概述
核查高校期末教学资料的归档规范性与材料完备性。以教学大纲、试卷审批表、成绩登记表、达成度评价报告、学生答卷包为对象,按课程分类逐项比对合规要求,输出可直接下发给教师整改的问题清单,以及供检查组使用的汇总报告。
本技能的实质价值不在"扫文件",而在控制误报:用错规则的自动化脚本会批量冤枉合规教师,反而比人工翻阅更糟。因此所有判定都遵循固定的取证规则(见下文核心原则),凡证据不足一律转入"待人工复核",绝不擅自判定违规。
> ⚠️ 首次使用(换单位)必读:assets/audit_config.json 里内置的机构名称是填好的示例值(取自「广东科技学院计算机与人工智能学院」)。换到贵单位前,请把它复制到待检查目录并改名 audit_config.json,把 institution.college_name(本院法定全称)、college_forbidden_names(需检出的历史旧称)、department_name(教研室名称)改成贵单位的写法。若照搬示例名称去查别的单位,红线 1(开课机构命名)会把全部合规大纲误报为违规——这是本技能最危险的单点错误。脚本在使用内置示例配置时会打印提醒。
何时使用
- 学期末开展教学资料检查、归档合规性核查、教学档案专项审计
- 工程教育认证、专业评估、教学检查前的材料自查
- 需要对一个归档目录下的多门课程批量核验材料是否齐全、表册是否填报规范
- 教师已按整改清单修改后,复核整改是否落实、负责人汇总材料是否与教师版同步
- 需要核对同一门课内同一份材料的多个副本是否同版本、同一信息在不同文件里是否自洽
核心原则(防误报,必须遵守)
- 槽位锚定:机构名称、课程代码、适用专业只从教学大纲基本信息表的对应单元格提取,禁止对全文做关键词扫描——正文里的"本专业由原某某学院与某某学院联合筹建"一类叙述性文字不是行政判定依据。基本信息表按内容定位(含"课程代码""适用专业"等标签的那张表),不按索引取:有封面表格的大纲,基本信息表在
tables[1]而非tables[0],写死索引会张冠李戴。 - 多源联合仲裁:专业名称由「封面文本 + 基本信息表适用专业槽位」联合判定。封面因排版换行只显示"软件工程"、基本信息表填了"软件工程(卓越工程师方向)",即判 100% 合规。判定时对外部基准给出的全部候选专业全称逐一比对,命中任一个即合规(同一专业不同年级/方向可能有多个合法全称)。
- 动态豁免:按目录路径与考核方式确定必备材料清单。位于"笔试科目文档"下的课程,学生答卷由学院纸质统一装订入库,电子版一律免检,不得列为缺失。
- 未检查 ≠ 合格:文件读不动、依赖缺失、判定依据不足时,记入"无法读取"或"待人工复核",不计入合格,也不伪装成通过。
- 不与 Excel 内部公式较劲:不核查达成度表内部的浮点除零、精度显示等细节,只查表间数据闭环与模板残留。详见
references/false_positive_lessons.md。
检查依据体系(核心机制)
本技能要求报告里每一条判定都能当场回答"依据是什么"。为此每条问题都携带 basis(判定依据)字段,依据只有三种来源:
| 类型 | 含义 | 典型来源 |
|---|---|---|
external 外部文件 |
以学校权威文件为基准动态比对 | 《教学执行计划及课程负责人安排表》《人才培养方案》《专业教学进程计划表》 |
config 技能配置 |
人工登记在 audit_config.json 的规则 |
占位符样式、目录命名、课程代码禁止后缀、错别字表 |
manual 人工确认 |
自动化确实无法判定,须检查人签署结论 | 答卷包内部批改规范、签名真实性、日期与考试安排是否吻合 |
每条依据带「文件 + 位置 + 基准值」三要素(如 外部文件:排课安排表v9.xlsx @ 排课安排表!B255,基准值「计算机学院」),教师质疑时可直接翻到原处。
基准文件的权威分工(三者不可互相替代):
| 基准文件 | 提供什么 | 不提供什么 |
|---|---|---|
| 教学执行计划及课程负责人安排表 | 课程代码、课程名称、开课部门、考核方式、课程负责人/任课老师 —— 课程代码与考核方式的唯一权威 | 指标点、学分学时 |
| 人才培养方案 | 专业规范全称、国标专业代码、毕业要求指标点 | 课程代码 |
| 专业教学进程计划表 | 课程名称、学分、学时 | 不含课程代码(故代码一致性以执行计划表为准) |
三条硬规则:
- 多候选不误伤:一个课程代码可能对应多行(多个班级、多位任课老师、甚至多个代码)。比对时取该课程全部候选行逐一试配,任一命中即合规;不要只取第一行,否则会把合规材料误报(如某课有 18 行记录,取首行会比对错责任人)。
- 冲突不隐瞒:基准文件之间、基准与配置之间若互相矛盾(如执行计划表写"计算机学院"而配置把它列为禁用旧称),记入报告「依据冲突」栏单列,并自动停用该禁用项,防止把全部合规文档批量误报;由人工裁定统一口径。
- 无依据不硬判:外部基准缺失时退回配置;配置也无对应规则时,转「待人工复核」,不擅自定为违规。
scripts/standards.py 负责加载与索引基准文件,scripts/basis.py 负责登记与渲染依据,scripts/audit_engine.py 负责判定并逐条挂依据。三者职责分离,改判定规则不必动依据模型。
课程内文件关联核查(R14–R16)
红线 1–10 查的是"单个文件自身是否规范";本模块查的是"文件之间的关系",解决两类隐藏缺陷:
- A. 同一材料的多个副本版本是否一致:同一份《教学大纲》常在「任课教师包」和「课程负责人汇总」两处各存一份,教师整改后只更新了自己那份,负责人汇总仍是旧版——文件名还往往不同,肉眼难发现。
- B. 不同文件里的同一信息是否自洽:课程名称、代码、开课单位、适用专业、考核方式、课程负责人、考核日期、班级、学生人数会同时出现在大纲、成绩表、审批表、达成度报告里,同一门课必须处处相同,并与外部基准一致。
为避免组合爆炸与海量误报,采用三层关联模型(详见 references/association_model.md):
| 层 | 内容 | 作用 |
|---|---|---|
| L1 课程实体 | 把散落在多目录、属同一门课的文件归拢为一个实体(优先按执行计划表的课程代码聚合) | 只在实体内部比对,绝不跨课程 |
| L2 逻辑文件 / 物理副本 | 同一材料类型 = 一个逻辑文件;磁盘上每份拷贝 = 一个物理副本 | 版本一致性 = 同逻辑文件异地副本内容指纹相同 |
| L3 字段槽位 | 「字段 × 文件来源」矩阵,逐格取值后交叉比对 | 按字段作用域限定比对范围 |
三条红线:R14 同课程文件版本一致(跨目录副本内容指纹不同 → 一般问题;同课程目录内 → 提示)、R15 课程内字段一致(同字段在课程内多种取值 → 一般问题,并按作用域限定)、R16 成绩数据闭环(成绩表人数 vs 达成度样本数,同班内不一致 → 待人工复核)。
关键防误报约定(改动本模块前必读):
- 版本比对只在异地副本间进行(同目录并存是有意的多份材料,不是分叉),且只比对文件名签名(
same_logical)指向同一份材料的副本——班级/年级/方向的命名差异会自动跳过。 - 字段比对按作用域分治:
invariant(课程名/代码/开课单位/考核方式)全课比对;specific(负责人/考核日期/班级)只在同一班级内比对;major(适用专业)只在"取值不是本院专业"时才报。 - 刻意不比对「任课教师」:各班各署各的,跨文件比对必然误报;教师与基准的一致性由 R13 负责。
- 内容指纹 = 正文文本去空白后的 SHA1,不是字节哈希——"另存一次"不算版本不一致,"改一个字"才算。
.doc/.pdf/图片/压缩包提不出正文指纹,不做内容判定,转「待人工复核」,绝不当作"一致"。- 课程负责人汇总目录里的达成度常是"多班合并口径",不参与 R16 班级闭环。
环境准备
脚本依赖三个库,缺失时脚本会明确报错并降级,不会静默跳过:
pip install python-docx openpyxl xlrd
python-docx:读 .docx 大纲(必需)openpyxl:读 .xlsx 成绩表与达成度报告(必需)xlrd:读旧版 .xls;未安装时 .xls 会记入"无法读取"(注意 xlrd ≥2.0 仅支持 .xls,不支持 .xlsx)
工作流程
- 备齐判定依据:把《教学执行计划及课程负责人安排表》《人才培养方案》《专业教学进程计划表》放进同一目录(通常是待检查目录或其上一级),用
--standards指向它。这是本次检查的基准来源——没有它,机构命名、课程代码、考核方式、课程名称、责任人等判定只能退回配置与人工确认,可靠性明显下降。 - 确认检查范围与规则:明确待检查的归档根目录;核对
assets/audit_config.json中的学院法定全称、禁用旧称、教研室名称、课程代码规则、目录名称是否与本学期实际一致。学院更名过就必须改这里(旧名进college_forbidden_names、新名进college_name),否则会把全部合规大纲误报为机构命名误写。 - 目录索引与课程分类:按路径把课程归为笔试科目类、非笔试考查/机试/大作业类、整周实训/综合实践类,三类必备材料清单不同(见
references/course_classification_guide.md)。 - 执行自动核查:运行
scripts/audit_engine.py,一次遍历完成命名、大纲元数据、签名与日期、达成度残留、答卷完备性、负责人材料同步、以及课程内文件关联(版本一致性 / 字段一致性 / 成绩数据闭环)共八项检查,每条问题附判定依据。 - 逐条人工复核:处理报告中的「待人工复核」与「无法读取」两类,并填写报告末尾的人工确认台账(
manual_checklist),这两类不自动定论,需打开文件确认并签署结论。关联核查转出的副本分叉、字段差异、人数不符也在此环节裁定。 - 输出双报告:运行
scripts/build_report.py生成《问题整改清单》与《核查情况汇总》,问题条目必须带证据坐标 + 判定依据,便于教师定位与质询回应。汇总报告含「课程内文件关联概况」板块(课程实体数、纳入比对的文件数、版本/字段问题数)。
脚本用法
第一步:全量核查,输出 JSON 与 Markdown 报告
python scripts/audit_engine.py --root "/待检查的归档目录" \
--standards "/存放执行计划表与培养方案的目录" --out ./检查报告
| 参数 | 说明 |
|---|---|
--root |
待检查的归档根目录,默认当前目录 |
--standards |
外部基准文件所在目录,逗号分隔多个。会在其中递归查找《教学执行计划及课程负责人安排表》《人才培养方案》《专业教学进程计划表》。不给时自动尝试 --root 及其上一级;仍找不到则判定退回配置与人工确认 |
--config |
配置文件路径;不指定时依次找 <root>/audit_config.json、skill 内置 assets/audit_config.json |
--out |
报告输出目录;不指定则只打印到屏幕 |
--format |
json / md / both,默认 both |
--only |
只跑指定检查项,逗号分隔:naming,syllabus,score,attainment,answer,sync,version,field。其中 version=同课程文件版本一致(R14)、field=课程内字段一致与成绩数据闭环(R15/R16) |
# 用主目录担任基准来源,只查签名、日期与达成度残留
python scripts/audit_engine.py --root "E:/期末资料" --standards "E:/期末资料" \
--only score,attainment --out ./out
# 只做课程内文件关联核查(副本版本一致性 + 跨文件字段一致性)
python scripts/audit_engine.py --root "E:/期末资料" --standards "E:/期末资料" \
--only version,field --out ./out
第二步:由 JSON 生成双报告
python scripts/build_report.py --json "./检查报告/审计报告.json" --out ./检查报告
生成四份文件:问题整改清单.docx/.md(面向任课教师,按课程分组,含证据坐标与整改建议)、核查情况汇总.docx/.md(面向检查组,含统计与问题类型分布)。两份报告都含依据登记率、基准文件清单、依据冲突、检查项–依据对照表、人工确认台账五个依据相关板块。未安装 python-docx 时自动只出 Markdown 并提示,不静默丢弃。
配置说明
机构专属规则全部集中在 assets/audit_config.json,脚本内不写死任何学校、学院、人名。换单位使用时,把该文件复制到待检查目录下命名 audit_config.json 即可覆盖内置配置(项目级优先于 skill 内置),无需改脚本。
主要配置项:
| 配置键 | 用途 |
|---|---|
institution.college_name / college_forbidden_names |
学院法定全称与需检出的历史旧称。判定时会先剔除文中的规范全称再比对旧称,所以旧称即便恰好是规范名的子串(如「人工智能学院」⊂「计算机与人工智能学院」)也不会误报,可放心登记 |
institution.acceptable_names |
过渡期并存名称白名单。更名当年新旧两套名称往往同时出现在材料里,把两者都列进来可避免批量误报。与 college_forbidden_names 冲突时自动停用禁用项并在「依据冲突」栏说明 |
standards.* |
外部基准文件的发现规则:文件名匹配式(patterns)、需跳过的目录(skip_tokens)、大纲里"教学执行计划"标签(teaching_plan_label)。换学校时若基准文件命名不同,改这里即可,不必动脚本 |
institution.department_name / department_aliases / department_forbidden_names |
教研室名称。大纲 Table 0「教研室」栏取到值且不符即报;取不到值(留白或值写在下一行)不判定 |
course_code.pattern / forbidden_suffixes |
课程代码匹配式与禁止后缀(如 -01)。脚本读取本字段,改配置即生效,不再有脚本内硬编码与配置不一致的问题 |
directories.* |
笔试/非笔试/负责人汇总目录名称、课程材料关键词、整周实训类识别词 |
score_sheet.blank_date_patterns |
视为"日期留白"的占位符写法 |
attainment.known_residue_tokens |
历史上一再出现的模板残留关键词(不要填在职人员真实姓名) |
answer_package.exclude_keywords |
判定学生答卷前须先排除的管理类表册词。不可删除——否则「达成度评价及分析报告」会因含"报告"二字被误认成学生成果,掩盖"整门课缺答卷包"这一重大缺陷 |
exemptions.* |
免检与豁免声明(笔试科目电子答卷免检、不核查 Excel 内部公式错误)。豁免项会写进报告的「主动豁免」一栏,避免后来者误以为是遗漏 |
naming.common_typos |
文件名常见错别字表,格式「错字: 正字」,可随历年检查持续追加,不必改脚本 |
naming.* |
重复后缀、临时文件前缀、需跳过的目录 |
crosscheck.material_types |
课程内文件关联核查的材料类型关键词表:把文件归为教学大纲/成绩登记表/试卷审批表/合理性审核表/达成度报告/考核方案/任务书·指导书/教学记录表,用于副本版本比对与跨文件字段比对。先登记先匹配 |
crosscheck.numeric_tolerance |
R16 数据闭环的数值容差(如「学生人数」默认 0);班型合并、缺考剔除属结构性差异时不宜靠容差掩盖,应人工确认 |
crosscheck.max_report_per_type |
单类关联问题的报告上限,超出仅在末尾记汇总条,避免噪声淹没真实问题 |
> 每学期开检前必做:核对 institution.college_name 与 college_forbidden_names 是否与本学期实际一致。学院更名时把旧名移入 college_forbidden_names、新名写入 college_name。若把新旧名写反,会导致全部合规文档被误报为机构命名误写——这是本技能最危险的单点错误。
问题分级与报告口径
| 级别 | 含义 | 典型问题 |
|---|---|---|
| 重大缺陷 | 材料实质缺失,必须补齐 | 非笔试课程仅有表册、完全无学生答卷或成果包 |
| 一般问题 | 明确违反红线,限期整改 | 机构旧称、教研室名称异常、专业名称简写、课程代码带后缀、签名缺失、日期留白、模板残留、槽位留白、文件名错别字、跨目录副本版本分叉(R14)、课程内字段不一致(R15) |
| 提示 | 格式瑕疵或需确认 | 重复后缀、连续句点、疑似系统生成的"副本"文件名、同一课程目录内的副本差异(R14) |
报告另设两栏,不计入合格:待人工复核(如压缩包内部批改细节、值写在下一行的槽位留白、成绩表人数与达成度样本数不符 R16、不可解析格式副本)、无法读取(文件损坏或缺依赖,其内容根本未被检查)。此外报告开头会给出依据登记率(多少条问题已附判定依据)、基准文件清单与依据冲突,末尾附检查项–依据对照表与人工确认台账。
参考资源
| 文件 | 内容 |
|---|---|
references/audit_checklist.md |
十项红线标准清单,逐项列出合规标准与违规判定;文末附自动检查覆盖度对照表(哪些红线自动判定到什么程度),避免把"未报问题"当成"已检查合格" |
references/association_model.md |
课程内文件关联模型:三层结构(课程实体 / 逻辑文件·物理副本 / 字段槽位)、三条红线 R14–R16、误报防护约定与已知边界 |
references/basis_matrix.md |
检查项 × 判定依据矩阵:每项检查的依据类型、基准文件与字段、兜底来源、自动化程度、人工确认要点一表看清 |
references/course_classification_guide.md |
三类课程的归档必备材料清单与豁免规定 |
references/false_positive_lessons.md |
十三类假阳性误报的根因分析与治理原则(1–9 单文件规范、10–13 课程内文件关联),改动判定规则前必读 |
assets/issue_templates.json |
标准话术模板库。机构专有名称一律用 {original}/{standard}/{department} 占位符,由调用方从配置取值填入,不得写死学院或教研室名称(否则学院更名后本文件会与配置冲突,把教师引向错误名称)。注意:当前 scripts/ 未自动套用本文件,属供报告定稿时人工套用的话术库 |
scripts/standards.py |
外部基准文件加载器,索引课程代码/名称/部门/考核方式/负责人、专业全称与指标点 |
scripts/basis.py |
判定依据模型与红线登记表:basis() 构造、render() 渲染、rule_table() 对照表、manual_checklist() 人工确认台账 |
scripts/crosscheck.py |
课程内文件关联核查(R14/R15/R16):课程实体聚合、副本内容指纹比对、跨文件字段槽位比对、成绩数据闭环 |
scripts/audit_engine.py |
核查引擎,输出结构化 JSON(每条问题带 basis) |
scripts/build_report.py |
由 JSON 生成双报告(docx / md),含依据相关五个板块与「课程内文件关联概况」板块 |
已知边界
以下内容自动化无法判定,一律列入待人工复核,不要当作通过:
- 学生答卷压缩包内部的批改规范(大题合分、小题评分细则表、教师签名)
- 成绩表内签名图片的真实性(只能确认是否存在图片对象)
- 旧版 .xls 的内嵌签名图片(xlrd 读不到图片对象)
- 表头与人名是否属于本课程(能比对代码、课程名与责任人一致性,但人名的真实性无法核验)
- 学院名称、专业名称是否正确(只能检出基准文件与配置中出现的名称,基准里没有的旧称需自行补进配置;不联网核对教育部专业目录)
- 文件名错别字(只能命中
naming.common_typos中登记的组合,表外的错别字需人工发现) - 《专业教学进程计划表》的学分、学时与执行计划表的逐项吻合(进程表不含课程代码,只能以课程名关联,同名课程可能张冠李戴,故该项转「待人工复核」)
- 基准文件本身的版本正确性:脚本无法判断
--standards指向的是不是本学期最新版的执行计划表。放入过期版本会得到失真结论,放入前须人工确认版本与学期 - 依据冲突的裁定:脚本能发现基准之间/基准与配置的矛盾并单列,但选哪个口径为准需人工决定
- 关联核查的裁定:脚本能发现"同一材料的两个副本内容不同"(R14),但不能判定哪一份是对的;能发现"同一份材料字段取值不一"(R15),但同义写法的口径需人工确认;能发现"成绩表人数与达成度样本数不符"(R16),但差异是否源于缺考/重修剔除须人工判定
- 不可解析格式的副本比对:
.doc/.pdf/图片/压缩包只能比对文件大小,内容级差异须人工逐项核对 - 课程归属:路径与文件名都不含《课程名》的文件无法建立关联,整体转人工