feat: 诊断(任务书 18 第一块):诊断数学、四种提交、一次运行跑多个实验、账本与材料、flow 诊断各步

消融默认关,关掉时解释阶段一并跳过;选诊断实验用信息价值减成本。
eval/diagnosis/research.json 为第三块配置。vocab 字段说明的出口文字随提示词一起改,见下一次提交的 prompts/ 与同文件改动(本次含在内)。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-05 10:36:20 -04:00
parent f39f8410e7
commit 852600df02
69 changed files with 6607 additions and 214 deletions
+17 -2
View File
@@ -1,7 +1,7 @@
import { mkdirSync } from "node:fs";
import { resolve } from "node:path";
import type { ResearchConfig } from "../config/index.ts";
import { forwardNotRunEvent, cellNotRunEvent } from "../materials/index.ts";
import { cellNotRunEvent, diagnosisNotRunEvent, forwardNotRunEvent } from "../materials/index.ts";
import { Ledger } from "../ledger/index.ts";
import { Runner } from "../runner/index.ts";
import { fullConfig, readFrozen } from "./frozen.ts";
@@ -10,6 +10,7 @@ import { ledgerFile } from "./paths.ts";
import { recover } from "./recover.ts";
import { baselineRun, saveBaseline } from "./steps/baseline.ts";
import { ablationRun, selectCells, settle, unsealChosen } from "./steps/ablation.ts";
import { diagnosisDedupe, diagnosisRun, diagnosisSettle, selectDiagnosisExperiments } from "./steps/diagnosis.ts";
import { forwardRun, adoptBatch } from "./steps/forward.ts";
import { dispatchStage } from "./steps/dispatch.ts";
import { dedupe, freezeProtocols, selectBatch } from "./steps/round.ts";
@@ -80,10 +81,12 @@ async function doStep(s: Study, next: Exclude<Next, { do: "freezeConfig" }>): Pr
return null;
case "baselineRun":
case "forwardRun":
case "ablationRun": {
case "ablationRun":
case "diagnosisRun": {
const ran =
next.do === "baselineRun" ? await baselineRun(s, next.run)
: next.do === "forwardRun" ? await forwardRun(s, next.round, next.candidate, next.run)
: next.do === "diagnosisRun" ? await diagnosisRun(s, next.round, next.run)
: await ablationRun(s, next.round, next.cell, next.run);
if (ran === "stopped") return USER_STOPPED;
if (ran === "done") return null;
@@ -103,6 +106,18 @@ async function doStep(s: Study, next: Exclude<Next, { do: "freezeConfig" }>): Pr
case "assignEntries":
assignEntries(s);
return null;
case "diagnosisDedupe":
await diagnosisDedupe(s, next.round);
return null;
case "selectDiagnosis":
selectDiagnosisExperiments(s, next.round);
return null;
case "diagnosisNotRun":
s.ledger.append("event", diagnosisNotRunEvent(next.round, next.reason));
return null;
case "diagnosisSettle":
await diagnosisSettle(s, next.round);
return null;
case "dedupe":
await dedupe(s, next.round);
return null;