simpleEval · 全生命周期实录

一堂课怎样走完整条评价管线

不是抽象流程图——下面用 b_tjpu10 批次里的一堂真实课程做主角, 从视频文件一路跟到最终得分:每一站讲清楚发生了什么处理、判据是什么、产出了哪些文件, 产出物全部是从服务器上原样摘出来的真数据(含真实抽帧画面)。主角没走到的分支(低置信路由、 KFA退化、ASR归因、人工回纳、言语筛查冻结),用同批次其他课的真实数据补齐在"支线剧情"一节。 2026-08-14 更新:G-3 护栏拆除(十门双臂 A/B 实证其防护已被评分 prompt 无条件措辞兜住,材料自动护栏归零)+ 教师言语筛查前移为 P6.8 前置合规闸 (有确证发现的课冻结分流人审,不进评分线;同批 T08 两课时因人审确认"对"被冻结退出)。 主角当天经历三轮重评:G-3 拆除 64→61.7、announce 闸放宽(v5 重析多抓到 1 段无宣布语的真实播放)61.7→62——均在 K=3 噪声带内。 2026-08-18 修缮批(全面审计后落地:队列条目内容身份 superseded、P8.8 终局台账、 抽取失败重试、评分哈希补全 M5)触发第四轮全批重评:62→63.3,四轮主短板 结论"平铺罗列"始终不变。

TJPU-XSX-T16-20250421-P0 主角课程 63.3 /100 最终得分(2026-08-18 修缮批重评)
学校 / 教师天津工业大学 / 高乐乐
课程 / 日期习近平新时代中国特色社会主义思想概论 / 2025-04-21
源视频文件【ZX】天津工业大学_高乐乐_习近平新时代中国特色社会主义思想概论_20250421.mp4
时长 / 内容2685.6 秒(44.8 分钟)· 第13章 维护和塑造国家安全
它是一节课的哪部分P0 = 该 session 两个课时文件中的第一个(另有 P1,独立打分互不合并)
沿途经历转写5148词 · 置信度过闸 · P6.8言语筛查1条发现被人裁"错"放行 · v6重析3段视频播放判定保持(含1段无宣布语——announce放宽新抓,自证线索完整)·全部KFA核验 · K=3 [60,65,65]均63.3 · 无归因指控 · 无高分歧 · v5时代3条指纹队列条目随重析superseded,现行待裁2条
姊妹页:《工作流全景:逻辑与参数》——本页按一堂课的时间线走; 那边按环节横切,每个环节的完整参数表和设计依据在那边。
目录
  1. 名词表——出现的每一个术语
  2. 全生命周期(15 站,每站含真实产出物)
  3. 支线剧情——主角没走到的 5 条路径(同批真实数据)
  4. 终态产出物清单(run 目录全文件树)
①

名词表

按主题分组。管线里出现的每个名词都在这里,后文直接使用不再解释——正文里带虚线下划线的名词可以鼠标悬停(或点按)弹出这里的解释,不用来回翻页对照。

身份与粒度
session
一节完整的课。一节思政课通常分两次录制成两个视频文件,所以一个 session 名下挂两个课时。例:TJPU-XSX-T16-20250421。
pid(课时)
一个视频文件 = 一个课时 = 唯一评价单元(2026-08-14 拍板终稿口径:不做任何形式的两课时合并成一节课——此前是"暂不拼接"的临时取舍,现在是定案)。命名 {session}-P0/-P1,后缀按文件名尾序号排,不代表上下半堂的先后。
sid 命名规则
校代号-XSX-T教师号-日期。XSX=习思想课程线;教师号来自冻结注册表(只追加不重排,扩批时旧编号不失效);全 ASCII 是因为中文在 ffmpeg 通配、shell、OSS 对象名上都踩过坑。
run(批次)
一次评价任务 = 一个目录 runs/<run名>/,里面有自己的 batch.json 和全部中间产物。换课程组合就换 run,互不干扰。本文主角所在 run 是 b_tjpu10。
batch.json
批次清单:{session: {label, periods:[{pid, path, fn, dur, tag, suffix}]}}。由 make_batch.py 生成(全语料抽样 / 显式清单 / 筛选产出三种来源),是整条管线的唯一入口输入。
/data/ro/
原始视频的只读绑定挂载路径。原始区是可写的网络盘,历史上有写坏风险;把它再挂载一次并设为只读,所有脚本只准从这条路径读——即使代码有 bug 想写,操作系统内核直接拒绝。
转写与说话人
ASR
自动语音识别(fun-asr 引擎)。管线的一切文本分析都建立在转写之上,因此转写质量是全链路第一大风险源。
热词表
179 个政治专名词条("新质生产力"等),转写时提高这些词被正确识别的权重。主体权重5、短词降4——全表盲铺高权会把"五育/五通"强插进正常语句(污染而非纠正)。与另一条生产线刻意共享同一份文件,防两份漂移。
diarization / diar
说话人分离:把每句话标上说话人编号(spk0/spk1…)。用于算"非主讲说话占比"——判断学生发言有没有被话筒收进去。
逐字置信度 conf
ASR 对每个词给出的 0~1 可信程度。conf_median=整课全部词的中位数。已验证:它能几乎完美识别"重度转写损伤"课(AUC=0.954),但识别不了同音字替换——转错成同音词时置信度照样很高。
asr_raw
fun-asr 原始返回存档(含逐词时间戳+置信度),出问题时唯一可回溯的东西。派生文件(diar.json)每次都从它全量重建;asr.json/ts.json/asr_ts 三份派生 2026-08-14 审计停产(零消费者),需要时从这里重新派生。
分流与人审
路由(route)
"这个课时能不能进打分"的判定。判"不能"(eligible=false)的不是删除,是转入人工审核,人可以推翻。
eligible
route 文件里每个 pid 的布尔字段。false = 暂不进打分材料,等人裁决。
adjudications.jsonl(人审队列)
全流程唯一一份"存疑待人裁决"清单,每行一条:{sid, claim_ref, target, ai_said, evidence_summary, verdict, why}。七个环节往里写(P1时长差/P6.5低置信/P6.8言语筛查/P8.5a1三类过半/P8.5a2核验卡/P8.6归因/P8.7高分歧;其中六个经 queue_lib 统一去重写入,speech_screen 自带同语义实现),人工经命令行 adjudicate.py 或图形化页面(:8130)填 verdict。
verdict
裁决结论,三选一:对(AI判断成立)/错(AI误判)/拿不准。铁律:只有明确"错"才触发自动回纳,不是"没被否定就放行"。
回纳
人工裁"错"(AI 误排除了一门能用的课)后,脚本自动把该课时 eligible 翻回 true 并加 overridden_by_adjudication 留痕——不删原始判据数据,只是不再据此排除。
打分材料与护栏
打分材料(score_inputs)
喂给评分模型的最终文本:可选的防冤枉句块 + 两类行为标注 + 转写全文。每课时一个 txt,是评分的唯一输入;2026-08-14 起只在 P8.5 一个出口产出(P8.5p 步骤——此前 P7 也产一次、一条链写三次,收敛后材料只有一个产出点,可审计)。
防冤枉句 / 护栏
写进材料头部、只防"无中生有扣分"的提示句。铁律:护栏≤5条(8条实测反而更差——规则稀释);绝不写入任何可当加分/减分依据的描述(实测"念稿提示"会被模型当-15分杠杆用)。2026-08-14 起自动护栏 0 条(G-3 拆除);块机制保留,仍服务人工核验存疑提示。
G-3
已拆除(2026-08-14)。曾是最后一条自动护栏:diar 非主讲占比 ≤3% 时注入"学生发言可能未被拾音,不得据此推断缺互动"。拆除依据:十门 K=3 双臂 A/B 实测其两个防护效果(互动状态误判、评语"缺互动"扣分泄漏)已被 D6 prompt 三处无条件保护措辞兜住——分差全在噪声带(-2.7~+2.0)、互动状态 0 翻转、评语泄漏 0 处。条件注入能做到的,无条件措辞同样做到,还少一层检测机器。substance.json 产出与视频原声反哺链连带移除。
视频原声反哺(P8.5a3)
已随 G-3 拆除移除(2026-08-14)。曾把 KFA 核验过的视频播放句从说话人占比里剔除重算(防视频原声灌高占比让 G-3 落空)——G-3 没了,它失去唯一消费者。学生展示 20% 闸不受影响(其视频区间重叠剔除在 segment_ratio.py 内完成,不经 substance)。
verified_asr_caveats(人工核验转写存疑提示)
与已拆除的自动护栏(G-3 那类算法自动检测触发的)不同来源:这条必须逐条人工核验后手写进 eval/data/verified_asr_caveats.json,不是自动机制。用于"根据人审结果重评"——把已核实的具体发现(哪个术语、大致时间点)转达给下一轮评分,防止模型读到同一段烂转写又得出同样的错误指控。是已拆除的"自动检测局部转写质量"(因猜测性不可靠被拆)的替代路径:不猜哪里可能错,只在人已经确认某处确实错了之后才说。
打分杠杆
任何会被模型拿去加减分的描述性信息。防冤枉句块有自检词表(念稿/放映/课堂纪律/机位等12词),头部混入任何一个直接报错退出。
两类行为与 KFA
两类课上行为
学生展示 / 视频播放——转写会误导评分的两类环节(视频原声冒充教师讲解、学生的话不该按教师讲授评价),这才是标注存在的理由。2026-08-14 五类→两类:复习/行政事务/课堂测试不再单独识别——三类都是教师本人在讲、转写忠实,评分模型读全文自己看得懂;实证收益率也极低(复习全库104个span仅1过闸、行政49个仅1过闸)。三类占比过半的判断移交 nonteach_overload。
span
模型标出的一段行为区间:{kind, from句号, to句号, 引文起止}。时长由代码按时间戳算,模型只判语义边界。
三道防线
span 的机器校验:①区间号必须合法 ②引文必须能在原文逐字找到(找不到=编造,丢弃)③短于3句或60秒的丢弃(防顺口一句被标成环节)。
证据闸
三道防线之上的分类专属门槛(KFA 批量核验实证定的):学生展示须"diar非主讲占比≥20%";视频播放 v5 起双路径(2026-08-14 放宽):有教师宣布原话=最强证据;无宣布须 ≥2 条独立线索自证(no_announce_evidence),编造宣布语整段作废。(复习/行政的"教师收束且>10分钟"闸随 2026-08-14 五类→两类拆除,实证记录在决策文档。)
end_basis
span 终点的依据:教师收束(教师有明确收尾话语)或 推断(模型猜的,把握度低,时长仅供参考)。(曾有 conf<0.70 自动降级机制,2026-08-14 二审拆除——end_basis 唯一消费者是核验卡展示,降级对任何自动口径零影响,其防的问题已被终点帧带覆盖;模型自报值原样保留。)
KFA
KeyFrame Arbitration 关键帧仲裁:把文本主张定位到时间戳→从视频抽帧→连同前文语境做成"核验卡"供人裁决。只读不改分。管线里三处使用:span写入材料前(P8.5a2)、高分歧课时(P8.7)、(证据附件形式)ASR归因(P8.6)。
核验卡
KFA 的产出:一个 JSON(主张+时间区间+画面路径+前文语境)+ 抽出的 jpg。2026-08-13 起 span 类核验卡从3帧改4帧(起点+2s/中点/终点-5s/终点+5s)——原来单独一帧取在终点-2s 正好卡在最难判断的边界上;改成终点前后各一帧,对比着看一眼就知道边界切没切准。视频播放 span 额外带终点帧带(见该词条)。产出核验卡 = 证据备齐;内容对不对仍由人裁决。
三层子票
2026-08-13 新增,图形化人审页面对 span 类核验卡的裁决方式:拆成分类(这段真的是这个行为吗)/边界(起止时间准吗)/引文(卡面引文与画面相符吗)三问各自投票。总verdict推导 2026-08-14 二审拍板修订:只由"分类"决定——旧规则"任一错→错"让引文失真冒充分类错误(T16-P0/span0 实案),且总票/引文子票本无自动化消费者,顶层"错"纯误导回看与报表;边界/引文判断完整保留在 sub_verdicts,且每层都有消费者:分类=错→撤销材料标注;边界/人裁终点→升格占比+结束标记移位。此前单票"对/错"会把三层信息压扁——首批人审两条"错"票实际都是"分类对、边界对,只是引文文本因播片段ASR失真而错"。
终点帧带
2026-08-13 新增,只给视频播放 span:end±5s 两帧只能回答"声称终点处还在放吗"这个是非题——终点报偏几分钟时人只知道"错了"不知道错多远。帧带在声称终点±2分钟内每15秒抽一帧摆成时间带,逐帧标就近句的 ASR conf(<0.70 标红≈视频原声),conf 连续两句恢复到 0.90+ 处紫框标出建议终点(辅助线,人裁决为准)。人审页面点选"视频已结束的第一帧"产出 end_pick:真实终点被夹在哪两帧之间(精度15秒)。其余四类的终点是语言边界,画面上没有"切换"可看,不做帧带。
人裁终点升格
2026-08-14 拍板:视频播放时长默认不计入自动占比(旧称"暂缓",概念同日退役——新口径就一句:人裁终点优先,无人裁不计入),但人审给出的终点是人确认过的事实。两条路径(闸都是分类子票=对):"回纳生效"时——A 显式点选:end_pick 双边界,时长=两帧中点(±7.5s)−起点;B 背书:边界子票=对且未点帧带(人对照 end±5s+帧带确认模型终点没切错),时长直接用被背书的模型值;两者都有时 A 优先。写回 segment_ratio.json:sec_human + nonteach_ratio_with_video + 重写显示 label,原始 sec/nonteach_ratio 留痕不动。单边界(早于帧带首帧/帧带外仍在播放)不升格,扩窗重抽后再裁。占比统计升格之外,2026-08-14 二审起路径A的人裁终点还回收进材料标注(annotate_spans 把〖…〗结束标记移到人裁终点所在句)。首轮真实回收(b_tjpu10):4 span 全升格,T10-P0 端点纠正 466→503s(人裁 774s 与 conf 建议 795s 方向互证)。
退化(有无标签)
KFA 核验不了(视频缺失/定位失败)的 span 不写入打分材料,只在 segment_ratio.json 里留"有过这类行为"的记录供报表——用户拍板的取舍:宁可少一条标注,不让不可核验的信息变成打分杠杆。
评分
codex 轨
主评分轨:gpt-5.6-sol 模型经 codex CLI 调用(在另一台机 openclaw 上执行),不走 API Key。当前单轨运行。
K=3
同一份材料独立评3次(每次全新会话,互相看不见),取均值为最终分。原因:单次评分噪声σ≈3.3分,而课与课的真实差距σ≈4.5分——评一次的信噪比≈1,必须多次平均。
极差 spread
K=3 三次分数的最大最小差。超过阈值(2026-08-13 起为 10,依 200 门实测分布下调)说明模型自己都判不准这门课,自动触发 KFA 抽帧核验其证据(P8.7)。
D6
当前生产版评分 prompt(打分准则)的版本号。输出字段:score(总分0-100)、reason(一句话定性)、content_score(内容分)、main_weakness(主短板标签)、evidence_quotes(支撑判断的转写原文引文,最多5条)。
EXTRA
拼在 prompt 末尾的4条固定任务纪律:用满量程敢打低分 / 确认式假问("是不是/对吧")不算互动 / ASR同音误转音对即正确不得扣分 / 独立判断不参考他课。
缓存失效(invalidate)
判断"这门课的材料/prompt 变没变":变了→旧分数作废重评;没变→直接复用,零成本。2026-08-14 机制改造:失效判据从侧车哈希文件改为 eval 条目自带 input_sha/prompt_sha(打分脚本写回时一并写入)——侧车是会与分数脱节的第二状态源,实测把字节相同材料的合法分数误判失效、白花 24 次调用;现在分数与"打这分用的材料+prompt"永远同一份状态、随 rsync 一起走。材料文件被上游闸清掉的课时条目也自动摘除;存量无哈希条目 grandfather 保留。2026-08-18 M5 补全:prompt_sha 配方纳入 EXTRA+model+effort(改评分纪律/换模型也正确失效),条目记 model/effort 留痕;调用方必传 --model/--effort,缺了退化为旧配方→每轮全批误判失效。
asr_blame(ASR归因核查)
P8.6:扫描评分理由里的"教师概念错误/说错"类指控——那可能是ASR转错字造成的冤枉。有指控一律推人审(实测触发率仅7.4%),附自动定位的证据(指控短语@时间戳+上下文+conf)。不用置信度做闸,因为同音误转恰恰是高置信度错误。裁决消费两级:判"错/拿不准"写 sidecar claim_overrides.json 供对外报告过滤(分数不变,零成本;2026-08-14 审计修正——原先还往 eval_codex 写 blame_overridden 标记,但它必被 P8 拉缓存覆盖、最终文件里从来不会有,已删);要真正干净的分数得走 verified_asr_caveats 触发彻底重评。2026-08-14 起入队条目带指控文本指纹(claim_ref=asr_blame_<sha256前8>)——重评后内容不同的新指控能重新入队,旧裁决只盖旧指控;并带 at_sec 视频跳转。
nonteach_overload(三类过半拦截)
2026-08-14 二次拍板定稿:判定放 P8.5a(通读带时间戳+说话人完整 diar 的环节),不放评分 prompt(材料无时间戳按篇幅估有盲区、评分 prompt 须单一职责)。分工守铁律"时长由代码算":模型报三类(复习/课堂测试/行政事务)的句号区间(2026-08-18 v6 起连分钟数也不报——v5 自报分钟数 10 门实测全是敷衍值 1),分钟数、占比与 >50% 判定全由代码按时间戳算,无合法区间按 0 不冤枉——合成正例实测:让模型直接下结论,62% 复习被判"无";改报分钟数后同一样例正确命中。判过半 → overload_route.py 写 eligible=false + 推人审,暂不推进后续环节(不进打分材料、不抽帧、不评分),人裁"错"经回纳恢复参评。半数以上时间不在讲授新内容的课,不适合按讲授质量评价。
教师言语筛查(P6.8 前置合规闸)
独立功能模块:筛查红线(价值导向/立场,severity单独标记)/跑题/身份不符言语(重点)/性质不符内容四类。2026-08-14 二次拍板从"P8.5S 只推人审不拦截"升级为前置合规闸:提前到材料构建之前,有确证发现的课写 speech_screen_route.json eligible=false 冻结——不建材料、不进 span 分析、不打分,先分流人审;该课全部条目被人裁"错"或二次放行(2026-08-14 拍板:verdict=对问题在案时人可显式裁定"准予回到评审队列",release=true+必填理由,发现记录不动)才放行,"对"未放行/"拿不准"维持冻结。条目带时间点、人审页一键跳转原视频核听(/video 端点,HTTP Range 流式)。防误报确定性证据闸:引文逐字防伪/成段类120s时长闸/conf<0.85标"疑转写失真"(播片段排除前置后首轮无 span 可用,靠 prompt 判例+人审兜底)。概念/事实类指控走 asr_blame 通道。真机回归:T08 两课时经人审确认"对"被冻结退出评分线。
图形化人审页面
review_server.py(stdlib HTTP服务)+ review_ui.html,内网 :8130。填补"KFA核验卡/队列只能命令行读写"的缺口——按 run 切换队列,span 类核验卡显示画面+三层子票,其余类型显示富证据文本,点按钮直接写回 adjudications.jsonl,"回纳生效"按钮直接触发 P6.6。跟命令行 adjudicate.py 读写同一份文件,可混用。
superseded(条目过期)
2026-08-18 修缮批:重析/重转/重评后内容已变的旧队列条目由生产方自动标记过期——裁决历史保留但不再生效,pending 视图隐藏(人审页勾选"显示已过期"可见,⌛标记禁投票)。由此 (sid, claim_ref) 不再唯一,全部消费方统一取未过期那条。配套:核验卡与帧图文件名带引文指纹,重析写新文件、旧证据永不被覆盖,过期条目仍能回看自己那张卡。首轮生产回归 8 条僵尸正确回收、已裁 9 条原样保留。
终局台账(run_manifest)
P8.8(2026-08-18 新增):整批"谁出分/谁被闸挡/谁在等人"一张表。每课时一行 final_state(scored/excluded_conf/frozen_speech/blocked_overload/pending_human/asr_failed/unknown+WARN)+ 闸依据 + 阻塞性待裁统计 + 经 claim_overrides 过滤的主短板("⚠指控被否")+ 占比账本挂载。纯只读派生,每次跑完(含 --only 局部重跑)都刷新;它是 claim_overrides 的第一个真实消费者,也取代了旧 grep 待裁告警的虚高口径。
弱信号(asr_blame 裸标签)
2026-08-18 H1:main_weakness 枚举标签单独命中指控正则(实际只有"概念混淆")不再入队——D6 强制五选一让"相对最弱项"冒充"事实指控",b_tjpu10 实测 4/4 条 asr_blame 全是裸标签、3 条 ai_said 只有七个字。收紧后须 reason 正文命中、或"概念混淆"且能从 reason 抽出具体概念对才入队;裸标签只计入"弱信号 N 条"打印。实测砍掉 3/4 条目且保住唯一被人审坐实的真实案例。
time_budget 区间化(v6)
2026-08-18 M2:三类时间预算从"模型自报分钟数"改为"模型报句号区间、代码按时间戳算分钟"(同类多段合并去重叠)。动机:v5 自报分钟数 10 门实测给的是 1,1,1,1,1,1,1,1,2,0——像敷衍填空,而这个零证据数字是唯一能拦评分的 overload 闸的全部输入。v6 起与 span 同款可校验;无合法区间按 0(无证据不计入,宁漏勿冤);模型原报区间落盘供人审溯源。
prompt_sha 对称失效
2026-08-18 H3:P6.8(言语筛查)与 P8.5a(span 抽取)的结果条目也记 prompt 指纹,换 prompt 自动全量重跑——此前只有 P8 有此机制,改筛查 prompt 旧结果不失效是隐性合规风险。segment_ratio 重跑走 carry_human_fields 移植路径,人裁字段不丢。同批还修了 error 永久缓存:API 失败的课下轮自动重试并醒目汇总(speech_screen fail-open 参评必须可见)。
②

全生命周期:15 站

绿点=处理站,橙点=判定闸,红点=人审相关,灰点=本课未触发。每站给出:处理逻辑 → 输入/输出 → 真实产出物摘录。

站0 · 管线之前

筛选与建批

screen_videos.py → make_batch.py

视频文件先过独立筛选工作流:ffprobe 能读、有音轨、时长≥1800秒、数字静音<10%(某秒采样全零=录制中断,不是课堂安静——活话筒录不出全零)。合格清单交给 make_batch.py 生成批次。主角所在 session 有两个视频文件(高乐乐 / 高乐乐1 = 同一节课的两个课时),都合格入批。

batch.json ▸ 主角所在 session(真实数据,原样)
"TJPU-XSX-T16-20250421": {
  "label": "天津工业大学|高乐乐|新思想|2025-04-21",
  "school": "天津工业大学", "teacher": "高乐乐", "date": "20250421",
  "total_dur": 5395.2,
  "periods": [
    {"pid": "TJPU-XSX-T16-20250421-P0",   ← 主角
     "path": "/data/ro/2025录课/2025上半年录课/中心录制/【ZX】天津工业大学_高乐乐_习近平新时代中国特色社会主义思想概论_20250421.mp4",
     "dur": 2685.6, "tag": "ZX", "suffix": 0},
    {"pid": "TJPU-XSX-T16-20250421-P1",   ← 同session的另一课时,各自独立走完全程
     "path": ".../【ZX】天津工业大学_高乐乐1_习近平…_20250421.mp4",
     "dur": 2709.6, "tag": "ZX", "suffix": 1}
  ]
}

此后运行一条命令:bash run_school.sh b_tjpu10,主角开始它的旅程。

P1

抽音频

batch_audio.py

44.8 分钟的 mp4 只解音频流(不碰视频),转成 ASR 要求的规格。先写临时文件再原子改名,中途断电不会留下半成品冒充成品。抽完用 ffprobe 核对时长:与源视频差>2秒说明解码可能丢了一段——会写一条记录进人审队列(只留痕不拦截)。主角时长核对通过,什么都没发生。

输入【ZX】天津工业大学_高乐乐_….mp4(/data/ro/ 只读区) 处理ffmpeg -vn -ac 1 -ar 16000 -b:a 48k(单声道/16kHz/48kbps) 产出audio/TJPU-XSX-T16-20250421-P0.mp3(约 15.7 MB)
P2

ASR + 说话人分离

transcribe_diar.py

先从 batch.json 生成课时清单 manifest.json,然后:mp3 上传对象存储 → 提交 fun-asr 异步转写(带179词热词表、开说话人分离、不做口语顺滑以保留原貌)→ 按返回结果里的文件URL回映射到 pid(绝不按提交顺序对号——返回顺序不等于提交顺序,映射不唯一会直接中止防串课)。主角转出 301 句、5148 个带置信度的词。

asr_raw/TJPU-XSX-T16-20250421-P0.json ▸ 首句(每个词都带时间戳+置信度)
"text": "上课上节课呢我们学习了第一个方面的问题啊,是第13章维护和塑造国家安全当中的第一个方面的问题啊,就是关于。"
"words": [
  {"begin_time": 240,  "end_time": 1000, "text": "上课", "confidence": 0.902},
  {"begin_time": 1080, "end_time": 1320, "text": "上",   "confidence": 0.989},
  {"begin_time": 1320, "end_time": 1680, "text": "节课", "confidence": 0.918}, …]
── 全课 301 句 / 5148 词
diar.json ▸ 主角前两句(说话人分离视图——后续所有环节的主输入)
{"speaker_id": 0, "begin_time": 240,   "end_time": 13080, "text": "上课上节课呢我们学习了第一个方面的问题啊,…"},
{"speaker_id": 0, "begin_time": 15170, "end_time": 25850, "text": "坚持总体国家安全观啊,主要是学习了为什么要维护和督导国家安全,…"}
输入audio/{pid}.mp3 + 热词表(179词) 产出asr_raw/{pid}.json(原始存档)· diar.json(逐句+说话人)· data/manifest.json(asr.json/ts.json/asr_ts 2026-08-14 审计停产——零消费者,需要时从 asr_raw 重新派生)

注意"维护和督导国家安全"——应为"维护和主导"或类似,这就是ASR同音误转的样子。它置信度不低,后面 P8 的 EXTRA 纪律和 P8.6 归因核查就是为这类问题准备的。

P6.5 · 判定闸

转写可靠性分流

conf_route.py

唯一不给开关的闸:算整课 5148 个词的置信度中位数,≥0.75 放行,<0.75 转人审(评一堂"听不懂"的课比不评更糟)。0.75 是刻意保守的阈值——只拦真正的转写崩坏;曾经加过的"60秒滑窗局部塌陷检测"已拆除(复杂度收益比不够,用户拍板)。主角 0.952,轻松过闸。

data/conf_route.json ▸ 主角条目
"TJPU-XSX-T16-20250421-P0": {"conf_median": 0.952, "n_words": 5148, "eligible": true}
P6.6

人工裁决回纳

apply_adjudication_overrides.py

把人审队列里的裁决自动落回管线:conf_route/nonteach_overload 单条"错"即把 eligible 翻回 true;speech 闸须该课全部条目均"错"或已二次放行(release,问题在案准予参评)才放行;span 分类否决/人裁终点也在本站写回 segment_ratio 供标注消费(套用前过引文防护闸:核验卡引文与当前 span 对不上=内容已被重析换掉,拒绝按下标盲套、WARN 须重新人审——实战拦下主角 v5 重析后的三条陈旧裁决);asr_blame 的"错/拿不准"写 claim_overrides.json sidecar(分数不动)。首轮跑到这里队列还是空的、脚本空转;重跑轮次主角的言语筛查条目被人裁"错"后,正是本站把它从冻结轨放行(speech_screen 自查与本站双路径同语义、无顺序依赖)。回纳机制完整演示见支线剧情③。

P6.8 · 判定闸

教师言语筛查·前置合规闸

speech_screen.py(2026-08-14 二次拍板,从 P8.5S"只推人审不拦截"前移升级)

qwen3.7-max 通读带时间戳+说话人的完整 diar,筛四类:红线(severity 单独标记)/跑题/身份不符(重点)/性质不符。模型说什么都要过确定性证据闸(引文逐字防伪、成段类 120s 时长闸、conf<0.85 标"疑转写失真");conf_route 判整课转写不可靠的课不筛查(2026-08-14 审计补——乱码 ASR 最容易伪造满足引文命中闸,不能凭它冻结课)。有确证发现 → speech_screen_route.json eligible=false 冻结:不建材料、不进 span 分析、不打分,先分流人审;该课全部条目被人裁"错"才放行。

主角的真实经历 ▸ 1 条发现 → 人裁"错" → 放行
发现: 教师转述美方言论时使用了"中国佬""香港佬"等歧视性称谓…(身份不符 @30:26)
人审: verdict=错 ——"确为转述美方言论,应不属于不当用语"
路由: {"eligible": true, "findings": 1, "kinds": ["身份不符"],
       "overridden_by_adjudication": true}   ← 放行,正常进入 P7
同批 T08-20250320 两课时没这么幸运:透露单位内部考核排名(跑题/身份不符)与"他妈的"粗俗用语两条发现均被人审确认"对"→ 维持冻结,退出评分线(eval_codex 不含其分数),走合规处置轨。这正是本闸存在的意义:存在合规问题的课先由人处置,不该被当作普通课打一个分。(2026-08-14 二审补充:若人工认为问题在案但课仍可评,可在人审页对该条目二次放行——发现记录不动、加 release 留痕,全部条目非阻塞即恢复参评;T08 目前未放行。)该判例也已写回筛查 prompt(转述中逐字复读的不当称谓属被引述内容,不报)。
P7

课时级转写集合

build_period_asr.py(打分材料 2026-08-14 起由 P8.5 唯一出口产出)

从 diar.json 拼出全文,排除掉 conf_route 判不合格与 P6.8 冻结的课时(并集)——本批 conf 全过闸,T08 两课时被 P6.8 闸排除,8/10 进入 asr_scoreable。substance.json(说话人占比)2026-08-14 随 G-3 拆除停产。

主角 diar 里 18.2% 的"非主讲"其实主要是课堂播放的视频原声被说话人分离聚成了另一个说话人(后面 P8.5 会确认这课放了约6分钟视频)——不是真有学生大段发言。旧管线为此配过 G-3 护栏与视频原声反哺(P8.5a3)两层机器;2026-08-14 双臂 A/B 证实评分 prompt 的无条件保护措辞("学生的声音有没有被话筒收录不影响判断""缺互动不构成扣分理由")已把这个坑兜住,两层机器一并拆除。
产出eval/data/asr_scoreable.json({pid:全文},8门);打分材料在 P8.5p 唯一出口产出
P8.5a

两类行为标注(曾为五类,2026-08-14 简化)

segment_ratio.py(qwen3.7-max, K=1)

整份 diar 转写逐句编号喂给模型,让它只标语义边界(第几句到第几句是什么行为),时长由代码按时间戳算。主角课在 v5 重析(announce 闸放宽后)标出 4 个候选 span,防线杀掉 1 个,活下来 3 个——其中 span2 没有教师宣布语,是放宽后靠模型自证线索新抓到的真实播放段:

被防线丢弃的 2 个(真实记录,segment_ratio.json ▸ dropped)
① kind=复习  第0~1句 "上课上节课呢我们学习了…"
   → 丢弃原因: 区间过短(2句/26秒),按正常教学衔接处理
     (教师顺口回顾上节课≠复习课——这正是最短区间闸存在的意义)
② kind=视频播放  第233~235句 "香港是美国最大的贸易顺差…"
   → 丢弃原因: 区间过短(3句/36秒)
     (教师确实说了"接下来我们通过视频来看",但36秒短片不足以按环节计时长;
      "教师宣布过播放"这个事实仍被记进 video_announced,没有丢失)
活下来的 3 个 span(v5 重析真实数据)
span0: 视频播放  第29~56句   242秒  announce_verified=true
       引文终点「我们英文基本强,甚至有一些大号。」 ← 这句不通顺:
         视频原声经教室音箱二次拾音,ASR质量断崖下降的典型样本
span1: 视频播放  第124~144句 182秒  announce_verified=true(央视短片)
span2: 视频播放  第209~222句  90秒  announce_verified=false ← v5 放宽新抓
       no_announce_evidence:「出现与课堂无关的记者现场出镜报道结构
       ('我是纽约市第五大道...'、'我身后就是特朗普大楼');转写质量断崖」
汇总: nonteach_ratio_label =
 "0.0% ⚠️ 另有视频播放 3 段(其中 1 段无宣布语)(约 9 分钟,占全课 19%),
  其时长因不可靠**未计入**本占比"

为什么显示 0.0%:视频播放时长的口径是人裁终点优先、无人裁不计入自动占比(旧称"暂缓类",概念 2026-08-14 退役——模型终点不可靠,数字不替模型背书;人在帧带上确认终点后经升格进 nonteach_ratio_with_video 另出一个数)。0.0% 绝不代表这课干净,标签里那句⚠️就是防误读的。announce 闸同日放宽:宣布语召回仅33%,v5 起无宣布段凭 ≥2 条独立自证线索也能进 spans,全量 KFA+人审兜底。

P8.5a1 · 判定闸

三类内容过半拦截

overload_route.py

P8.5a 顺带产出的三类时间预算(复习/课堂测试/行政事务各约几分钟——分工守铁律:模型只按时间戳报分钟数,占比与 >50% 判定由代码算)在这里落判:合计超过全课一半的课时写 overload_route.json eligible=false 拦截(不进材料、不抽帧、不评分)并入队人审(claim_ref=nonteach_overload),人裁"错"经 P6.6 回纳恢复。半数以上时间不在讲授新内容的课,不适合按讲授质量评价。主角三类预算合计 0 分钟;本批 10 门均无过半判定,本站空转通过。

产出eval/data/overload_route.json(本批空=无拦截)
P8.5a2 · 判定闸

span 级 KFA 前置核验

auto_kfa_spans.py → kfa_verify.py

过了证据闸、即将写入打分材料的 span,先抽帧核验:起点+2s / 中点 / 终点-5s / 终点+5s 共 4 帧(<6秒只抽1帧),连同前5句语境做成核验卡。能产出核验卡(证据备齐)是写入打分材料的前置条件;核验不了的退化为报表标签。主角三个 span 都核验成功(含无宣布语的 span2——它的卡带 announce_verified=false 警示,人审重点核对画面)。下面是 span0 的三张代表帧(起点/中点/终点侧):

span0起点帧
起点 290.3s · 央视画面已在放
span0中点帧
中点 394.8s · CCTV-1 台标清晰
span0终点帧
终点 499.3s · ⚠️ 视频疑似还在放
eval/data/kfa_span_verdicts.json ▸ 主角条目 + 队列新增2条
"TJPU-XSX-T16-20250421-P0": {
  "0": {"verifiable": true, "kind": "视频播放"},
  "1": {"verifiable": true, "kind": "视频播放"},
  "2": {"verifiable": true, "kind": "视频播放"}}
→ 同时产出核验卡 kfa_cards/{pid}_span{i}_{引文指纹}_视频播放.json + jpg
  (2026-08-18 起卡与帧图文件名都带指纹——重析写新文件,旧证据永不被覆盖,
  过期条目仍能回看自己那张卡)
→ adjudications.jsonl:claim_ref=spanN_引文指纹(2026-08-14 指纹化,重析后内容
  变化的新发现不再被旧条目挡住;同内容重跑同指纹幂等);2026-08-18 起内容对不上
  当前产物的旧条目自动标 superseded——主角 v5 时代的 3 条指纹条目已因 v6 重析
  内容微变全部过期,现行待裁 2 条新指纹条目
外部意见(Opus 独立复核):两个 span 的"视频播放"分类都对(台标/字幕铁证),但 span0 的终点帧显示视频还在放——"教师收束"信号疑被 ASR 乱码误触发,边界切早了;span1 虽标"推断",终点反而精确落在片内解说词上。
真人裁决(图形化人审页,两轮盲测):span0=错、span1=错——理由不是分类错,是卡面引文文本本身因播片段ASR失真读不对(span0"我们已经有机关枪,甚至有了一些大炮了"被转写成"我们英文基本强,甚至有一些大号";span1"国土安全是立国之基…引发国家安全的总体危险"被转成"立国之精神…总体的")。这正是 2026-08-13 把核验卡拆成"分类/边界/引文"三层子票、把末帧从单帧改 end±5s 双帧的动因——单票"错"当时压扁了"分类对、边界对、只是引文本文错"这三层信息。
P8.5p

打分材料·唯一出口

prep_score_inputs.py(无条件必跑,2026-08-14 起材料只有这一个产出点)

从 asr_scoreable 拼出每课时的打分材料 txt(自动护栏 0 条——G-3 已拆;有人工核验存疑提示的课在头部追加提示句),并对 overload/speech 两闸的拦截课兜底清除残留 txt(防 --only 局部重跑时旧材料被 P8 捡走)。生成后自检:材料头部混入念稿/放映/机位等 12 个打分杠杆词之一,整步报错退出。主角无护栏、无提示,材料就是转写全文:

eval/score_inputs/TJPU-XSX-T16-20250421-P0.txt ▸ 此刻的开头(自动护栏 0 条,无块,直接全文)
〖课堂转写全文〗
上课上节课呢我们学习了第一个方面的问题啊,是第13章维护和塑造国家安全当中的
第一个方面的问题啊,就是关于。坚持总体国家安全观啊,……(10135字)
产出score_inputs/{pid}.txt ×8 · data/score_inputs.json(P8.5b 标注后回写为最终版)
P8.5b

标注写回打分材料

annotate_spans.py --kfa-verdicts(2026-08-14 从 build_abc_variants 收敛更名)

KFA 核验通过的 span,按引文位置把中性的起止标记插进转写全文(覆盖 P8.5p prep_score_inputs 刚产出的未标注版,并把标注后全文回写 data/score_inputs.json)。标记只说明"这段不是教师本人讲授",不带任何评价色彩——防杠杆铁律。

score_inputs/TJPU-XSX-T16-20250421-P0.txt ▸ 标注后(10135字→10290字)
〖课堂转写全文〗
上课上节课呢我们学习了…(正常讲授)…
〖以下为教师课堂播放的视频/音频片段原声转写,不是教师本人现场讲解,
  不代表教师自己的知识储备或论证水平〗
经济发展离不开科技创新和进步。……我们英文基本强,甚至有一些大号。
〖视频播放片段结束,以下恢复教师本人讲授〗(@字符1682)
…(正常讲授)…
〖以下为教师课堂播放的视频/音频片段原声转写,…〗
国土安全是立国之精神。……
〖视频播放片段结束,以下恢复教师本人讲授〗(@字符4616)
…(后续正常讲授到结尾)

这一步的意义:没有标记时,评分模型可能把央视解说词的论证水平当成教师的(虚高),或把视频原声的ASR乱码当成教师表达差(冤枉)。

P8

直评出分(codex 单轨 K=3)

invalidate_stale_cache.py → codex_score.py(在 openclaw 上执行)

①先做缓存核对(2026-08-14 起判据=eval 条目自带的 input_sha/prompt_sha 纯比对,哈希侧车已砍——它是会与分数脱节的第二状态源,实测误判过 24 次重评):材料或 prompt 变了→旧分作废真评;被上游闸清掉材料的课时条目自动摘除。②材料+D6 prompt 同步到评分机 openclaw,起 3 个互相隔离的全新会话各评一次(模型 gpt-5.6-sol,prompt=D6 准则+EXTRA 四条纪律+材料全文),每次输出经 JSON Schema 强校验(score 必须是 0-100 整数,非法即重跑该次)。③三次取均值。

eval/eval_codex.json ▸ 主角条目(2026-08-18 修缮批重评,真实摘录;条目自带 input_sha/prompt_sha/model/effort——M5 起哈希配方纳入 EXTRA+model+effort,改评分纪律或换模型也会正确失效)
"TJPU-XSX-T16-20250421-P0": {
  "scores": [60, 65, 65],        ← K=3 三次独立评分,极差5
  "zhiping": 63.3,               ← 最终分 = 均值
  "main_weaknesses": ["平铺罗列", "平铺罗列", "平铺罗列"],
  "model": "gpt-5.6-sol", "effort": "medium",   ← 2026-08-18 起留痕
  "reason": "课程能够以发展与安全的辩证关系统摄部分内容并联系学生专业,
    但主体仍以教材结论、考试提示和领域举措的连续罗列为主,芯片、关税等
    案例多停留于印证立场,未充分转化为递进的学理论证。"}

四轮重评对照:G-3 时代 64/64/64 → G-3 拆除 65/60/60(61.7)→ v5 重析(材料多了无宣布语段的标注)60/64/62(62)→ 2026-08-18 修缮批(M5 哈希配方变更触发全批重采样)60/65/65(63.3)——四轮全部在 K=3 噪声带(单次σ≈3.3)内,主短板"平铺罗列"十二次评分全部一致;诊断结论稳定。转写里"国家利益之上"(应为"至上")、"经营安全"(应为"经济")这类同音误转——EXTRA 里"音对即正确不得扣分"这条纪律就是让模型见到这些不扣分的。

P8.8

终局台账(2026-08-18 新增)

run_manifest.py(每次跑完都刷新)

整批的"谁出分/谁被闸挡/谁在等人"一张表。此前批次 10 课时只有 8 门进 eval_codex.json,被冻结的课从结果里彻底消失——要知道去向得同时翻两个文件; 1000 门规模下这是交付事故不是 bug。台账每课时一行 final_state + 闸依据 + 阻塞性待裁统计(span/quote/blame 未裁不算阻塞)+ 经 claim_overrides 过滤的主短板(被人审否决的指控标"⚠指控被否")。

run_manifest.json ▸ 2026-08-18 首跑真实汇总(b_tjpu10)
scored 6 · frozen_speech 4 · 阻塞性待裁 4
主角 TJPU-XSX-T16-20250421-P0:scored 63.3 · 主短板 平铺罗列 · 待裁 0/2(非阻塞)
[占比] 0.0% ⚠️ 另有视频播放 3 段(其中 1 段无宣布语,约 8 分钟占全课 17%)
       ——其时长因不可靠未计入本占比(人裁终点优先口径)

首跑即立功:台账直接点名参评池 8→6 的原因——全量重筛新抓 2 条边界发现(T10-P1 教师调侃学生转卖课本 / T15-P0 疑似贬损语且模型自标可能 ASR 失真),两门新冻结待人裁。这是筛查 非确定性的真实暴露:单遍筛查召回不完整,重筛会抓到首轮漏掉的边界案例 (宁多审勿漏审侧误差,站 2 大样本统计重筛新增率)。

终点

定稿 + 人审闭环

review_server.py(图形化人审页 :8130)

主角拿到最终分 63.3/100(主短板"平铺罗列")。这门课经历过四轮管线升级的重新检验:2026-08-13 的 b/c/d 三项调整后重评分数原样不变(64/64/64);2026-08-14 G-3 拆除后重评得 65/60/60;同日 v5 announce 放宽重析(材料多了无宣布语段标注)再评得 60/64/62;2026-08-18 修缮批(M5 哈希配方变更)重采样得 60/65/65——四轮变动全部在 K=3 噪声带内,主短板诊断十二次评分全部一致,是"过程反复变、结论稳得住"的真实对照。

它给人审队列留下的 2 条 span 核验卡(span0/span1)已经裁决完毕:人在图形化页面上看画面后都判错——不是分类错,是卡面引文文本因播片段 ASR 失真读岔了(详情见上方 P8.5a2 站)。这两条真实裁决正是"三层子票"机制诞生的直接原因。裁决结果不改主角的分数,只影响"这类判定将来是否可信"的持续校准。

最终产出eval_codex.json(分数)· run_manifest.json(终局台账,2026-08-18起)· score_inputs/(评分依据材料)· segment_ratio.json(行为占比)· speech_screen_route.json(合规闸路由)· kfa_cards/(带指纹的画面证据,重析不覆盖)· adjudications.jsonl(主角旧span裁决2条+言语筛查1条裁"错"在档;v5时代3条指纹条目随v6重析标superseded,现行待裁2条新指纹条目)
③

支线剧情:主角没走到的 5 条路径

全部用同批(或近期真实批次)的真实数据演示。

① ASR 归因指控——从检出到彻底重评的完整闭环TJPU-XSX-T15-20250311-P0(邓鹏)

这门课三次评语一致指控"将人民民主专政同时表述为国体和政体等关键概念混淆"并因此压分(K=3: 67/78/74)。P8.6 检出指控→自动入队,附证据(指控原文+概念在转写里的时间定位+conf+上下文,三层递进,比早期版本只给"指控句无可抽取引号短语"丰富得多)。

外部意见(Opus 独立复核):正确表述应为"政体是人民代表大会制度";"人民代表大会制度"与"人民民主专政"音节声韵几乎不重叠,ASR 不可能整体转错——倾向教师真说错了(且是"写下来"的听写场景,危害大于口误)。

真人两轮盲测裁决:第一轮"错"(转写不准确,附逐处时间戳);重推盲测后第二轮独立复核仍是"错"——两轮一致,推翻了 Opus 的音节论证。这条真实分歧本身是最有价值的校准数据:语音学推理再自洽也替代不了听音频。

彻底重评:sidecar 过滤(claim_overrides.json)只解决"报告里不显示",不解决"旧分数仍隐含冤枉扣分"。把两轮人审的具体发现写成 verified_asr_caveats.json 里的一句提示("经两轮人工听音频复核…不得依据这些位置的转写文字判断教师在国体/政体相关概念上存在混淆"),持久化进 P7,让 invalidate_stale_cache 带动这门课重新打分:

重评前后对照(真实数据)
重评前  K=3: 67/78/74  均73    主短板: 概念混淆/概念混淆/概念混淆
重评后  K=3: 80/73/80  均77.7  主短板: 平铺罗列/平铺罗列/平铺罗列   ← +4.7分
新三轮评语完全没有再出现"国体/政体混淆"类表述;P8.6 重跑该批全部10门"检出0门"。

没有编造教师原话(两轮人审也没能确认原话是什么),只是如实转达"这里核验过不可靠",模型就能给出不带这个偏见的独立评价——这是整套机制刻意的设计边界:不猜、只转达已核实的事实。

② 整课置信度不过闸 → 路由人审机制演示(本批 10/10 全过闸,无真实案例)

若某课时 conf_median=0.71(<0.75),conf_route.json 会记 "eligible": false 并写队列条目:"整课conf_median=0.71 < 阈值0.75(5148个词)"。该课时不进打分材料但不删除——P7 的 build_period_asr 会跳过它,直到有人裁决。历史依据:这道闸在606语料+2025录课共68门人工金标上验证过(重度转写损伤 14/14 零漏检)。

③ 人审裁"错" → 自动回纳机制演示(衔接支线②)

人在页面听了支线②那门课的录音,判断"转写虽差但课能评",点错(=AI排除错了)→ P6.6(或页面上的"回纳生效"按钮)把该课时改回 "eligible": true, "overridden_by_adjudication": true(原 conf_median 数据保留作证据)→ 重跑 --from P7 它就进材料了。裁"对"或"拿不准"都维持排除——必须被人明确否定才放行,不是没人管就默认通过。

④ KFA 核验不了 → 退化为有无标签合成测试验证过的真实路径

若 span 的视频文件缺失/时间戳残缺,kfa_verify 产不出核验卡 → verdicts 记 "verifiable": false → P8.5b 跳过该 span 的标注(打分材料保持干净),span 信息只留在 segment_ratio.json 里当"这课有过视频播放"的报表事实。验证记录:对主角的两个 span 人为标 false 重跑,材料标注 0 处、正文无任何标记残留。

⑤ G-3 护栏——从触发到拆除TJPU-XSX-T04-20250325-P0(吕瑞林)等本批曾触发的 7 个课时

G-3 时代(~2026-08-14),非主讲占比 ≤3% 的课材料头部会注入 "学生发言可能未被拾音,不得据此推断缺互动"的防冤枉句块。2026-08-14 拆除: 十门双臂 A/B 实验(同批数据,唯一变量=有无 G-3 句)证实它防的两个错都已被评分 prompt 的无条件保护措辞兜住——分差全在噪声带(-2.7~+2.0)、互动状态 0 翻转、 评语"缺互动"扣分泄漏 0 处。现在这 7 门课的材料与其余课一样直接以〖课堂转写全文〗开头, 自动护栏 0 条。

防冤枉句块机制与 BANNED 12 词自检仍在 (服务人工核验存疑提示):头部若混入"念稿/放映/课堂纪律/机位"等杠杆词之一,整步报错退出 ——防冤枉句永远不能变成扣分借口。遗留待查:A/B 里"仅确认式假问"组均值 -1.5 的方向性 弱信号(n=10 不显著),下一个大样本批次分组复核。

④

终态产出物清单

主角走完全程后,run 目录 /data/simpleEval/runs/b_tjpu10/ 的真实文件树(standing 2026-08-14,注释标明每个文件是哪一站产的、给谁用)。

runs/b_tjpu10/ 文件树(真实,含主角相关全部产物)
b_tjpu10/
├─ batch.json                    ← 站0 make_batch 产;全线唯一入口清单
├─ adjudications.jsonl           ← 人审队列(全流程唯一一份);含主角3条已裁决
├─ audio/{pid}.mp3               ← P1 产;P2 的输入(ASR完成后即可清理)
├─ asr_raw/{pid}.json  ×10       ← P2 产;原始转写存档(唯一可回溯源,别删)
├─ diar.json                     ← P2 产;逐句+说话人,P6.5/P7/P8.5/KFA 都读它
│  (asr.json/ts.json/asr_ts 2026-08-14 审计停产——零消费者,从 asr_raw 可再派生)
├─ data/
│  ├─ manifest.json              ← P2 产;课时清单
│  └─ conf_route.json            ← P6.5 产;置信度判定(主角 0.952 ✓)
└─ eval/                         ← P7 起的评价工作区
   ├─ data/
   │  ├─ speech_screen.json      ← P6.8 产;言语筛查逐课发现(含证据闸丢弃记录)
   │  ├─ speech_screen_route.json ← P6.8 产;前置合规闸路由(T08两课时 eligible=false)
   │  ├─ asr_scoreable.json      ← P7 产;{pid: 全文}(过双闸课时才在里面,本批8门)
   │  ├─ verified_asr_caveats.json ← 人工手写(P8.6裁决后);P8.5p重新读取时注入材料
   │  ├─ claim_overrides.json    ← P6.6 asr_blame轻量消费产;对外报告过滤用
   │  ├─ score_inputs.json       ← P8.5p 产、P8.5b 标注后回写;材料全集(与 txt 一致;_stat 台账 2026-08-14 停产)
   │  ├─ segment_ratio.json      ← P8.5a 产;span+占比+丢弃记录(报表数据源)
   │  ├─ overload_route.json      ← P8.5a1 产;三类过半拦截路由(本批空=无拦截)
   │  └─ kfa_span_verdicts.json  ← P8.5a2 产;span 可核验判定
   ├─ score_inputs/{pid}.txt ×8  ← P8.5p 产 P8.5b 覆盖;评分的唯一输入材料
   ├─ prompts/                   ← P8 拷入刷新(P7 的冗余拷贝 2026-08-14 删);D6 快照(可追溯)
   ├─ kfa_cards/                 ← P8.5a2 / P8.7 产;核验卡 json + 4帧关键帧 jpg(人审页面读)
   └─ eval_codex.json            ← P8 产;★最终成绩单(分数/评语/引文/短板/input_sha/prompt_sha
                                    ——哈希侧车 2026-08-14 砍除,失效判据入条目;blame 过滤读 claim_overrides.json)

配套入口:图形化人审页 :8130(裁决 adjudications.jsonl,span核验卡三层子票);工作流逻辑+参数详解页 :8121。