--- type: schema node_id: schema:baseline-diagnosis title: "表结构: baseline_diagnosis(逐题诊断信号)" date: 2026-07-15 --- # 表结构: baseline_diagnosis(逐题诊断信号) > 载体:`harness.db`(`workspaces//harness.db`)。用途:把已有 baseline run(如 `infer_adhoc`)的每道错题诊断结果落成信号行,供视频级切分选择器消费。**逐题 upsert,可断点续跑。** > 实现:`schema:results-driven-video-split` 计划 Task 3(端口 `DiagnosisSignalStore`(`core/evolution/protocols.py`)+ 适配 `adapters/baseline_diagnosis_store.py`),遵循 `app/harness/log.py::HarnessLog` 既有约定(`create_table` + `insert(mode="replace")` 实现 upsert)。 ## 列定义 | 列 | 类型 | 可空 | 说明 | |----|------|:---:|------| | question_id | TEXT | 否 | 题唯一标识(canonical 取行 = 每 qid 第一行 `ORDER BY rowid`) | | video_id | TEXT | 否 | 视频标识 | | baseline_run_id | TEXT | 否 | 溯源 run(如 `infer_adhoc`) | | diag_fingerprint | TEXT | 否 | `hash(诊断prompt版本 + model + 诊断代码git短SHA)`,`--force` 用新值不覆盖旧 | | task_type | TEXT | 否 | 12 类之一 | | error_type | TEXT | **是** | extraction/search/reasoning/mixed;**T0(INFRA)/uncertain 行为 NULL** | | cause_category | TEXT | 是 | defect/lapse;正确题/INFRA/未判为 NULL | | tier | TEXT | 否 | T0 / T1 / T2 / uncertain | | evolution_target | TEXT | **是** | 由 error_type 派生 tool/skill/system;error_type 为 NULL 时亦 NULL | | degraded | INTEGER | 否 | judge 解析失败降级 0/1 | | infra | INTEGER | 否 | INFRA(stop_reason∈{error,parse_error})排除 0/1 | | session_id | TEXT | 是 | 遥测关联 ID | **主键**:`(question_id, baseline_run_id, diag_fingerprint)` —— 保证 upsert 幂等、不同 fingerprint 隔离、断点续跑按已完成集跳过。 **tier 写规则**:INFRA 题 `infra=1, tier=T0, error_type/cause_category/evolution_target=NULL`;degraded/诊断失败题 `degraded=1, tier=uncertain, error_type` 可 NULL;`cause_category='defect'`→`tier=T2`;`='lapse'`→`tier=T1`。仅 T2 进 48 格覆盖。 ## 埋点位置 | 位置 | 动作 | |------|------| | `app/harness/baseline_diagnosis.py::run_baseline_diagnosis`(计划 Task 4) | 投影 `run_diagnosis` 的 `error_attributions` + `infra_question_ids` + `degraded_question_ids` → 逐行 `store.upsert(DiagnosisSignalRow)` | | `adapters/baseline_diagnosis_store.py::SqliteDiagnosisSignalStore.upsert`(计划 Task 3) | `INSERT OR REPLACE`(单事务原子) | | 读回 | `.done_question_ids(run,fp)`(续跑跳过)/ `.load(run,fp)`(选择器输入) | ## 关联 - 实现设计:`design:results-driven-video-split` - 被度量:`metric:split-signal-tier-distribution`、`metric:split-cell-coverage`