feat: 任务书 11,指标名加候选前缀、消融重做接着改、判重说明补关键设定

- 假设专用指标短名不能含"."(最长 64),冻结时由 materials 的 freezeProtocol 改为全名"候选编号.短名";可引用清单用全名,已占用清单只剩任务指标和两个保留键。
- 消融格核验不通过重做时,工作目录是上一次交的这一格代码的副本,能读的版本加上它,完整代码照旧列出;消融实现提示词同步改。
- jev 判重材料说明补 keySettings 一句。
- 结构.md 第八部分 vocab、materials、jev,WORK_LOG 同步更新。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-03 06:40:40 -04:00
parent f623fb78a8
commit 13a7e60355
20 changed files with 156 additions and 57 deletions
+13 -5
View File
@@ -20,12 +20,13 @@ const r = (q1: number, q5: number, q9: number) => ({ q1, q5, q9 });
const factor = (name: string, continues: string | null) => ({ name, method: `${name}的做法`, keySettings: "无", continues });
const metric = (id: string) => ({ id, meaning: "次数", unit: "次", direction: "maximize" as const, howMeasured: "数", missing: "recordMissing" as const });
const RULES = { factorLimit: 2, continuable: ["r1-c1-p1", "r1-c1-p2"], reusableMetrics: ["restart-count"], takenMetricIds: ["sum-of-radii", "wall-seconds", "answer-path", "safeguard-triggers", "restart-count"] };
// 能引用的是冻结后的全名"候选编号.短名";已占用的只有任务的指标和两个保留键(任务书 11 第一部分)。
const RULES = { factorLimit: 2, continuable: ["r1-c1-p1", "r1-c1-p2"], reusableMetrics: ["r1-c1.restart-count", "r1-c2.restart-count"], takenMetricIds: ["sum-of-radii", "wall-seconds", "answer-path", "safeguard-triggers"] };
const PROPOSAL: Submission<"proposal"> = {
factors: [factor("多起点", null), factor("扰动", "r1-c1-p2")],
safeguards: ["guard"],
metrics: { defined: [metric("kick-count")], reused: ["restart-count"] },
metrics: { defined: [metric("kick-count")], reused: ["r1-c1.restart-count"] },
authorEstimate: r(1.1, 1.2, 1.3),
body: "提案正文",
};
@@ -188,13 +189,20 @@ test("规则 2、3、4、10 对统一自己的字段查:因子超上限、保
});
test("规则 10:reused 要在可引用清单里;新登记的编号不重复,也不能和已占用的重名(含答案路径两个保留键)", async () => {
assert.match(await rejected(proposal({ ...PROPOSAL, metrics: { defined: [], reused: ["kick-count"] } }, 0)), /metrics.reused 只能写 restart-count;你写的 kick-count 不在里面/);
assert.match(await rejected(proposal({ ...PROPOSAL, metrics: { defined: [], reused: ["kick-count"] } }, 0)), /metrics.reused 只能写 r1-c1\.restart-count、r1-c2\.restart-count;你写的 kick-count 不在里面/);
const reason = await rejected(proposal({ ...PROPOSAL, metrics: { defined: [metric("a"), metric("a"), metric("wall-seconds"), metric("answer-path")], reused: [] } }, 0));
assert.match(reason, /metrics.defined 里编号 a 写了不止一次/);
assert.match(reason, /metrics.defined 的编号 wall-seconds 已被占用/);
assert.match(reason, /metrics.defined 的编号 answer-path 已被占用/);
});
test("规则 10:引用写短名而不是全名时退回,原因里列出能引用的全名;新登记的短名和已登记的全名同名不算占用", async () => {
const reason = await rejected(proposal({ ...PROPOSAL, metrics: { defined: [], reused: ["restart-count"] } }, 0));
assert.equal(reason, "这份提交没有收下,要改的地方:\n- metrics.reused 只能写 r1-c1.restart-count、r1-c2.restart-count;你写的 restart-count 不在里面");
const v = await receive(proposal({ ...PROPOSAL, metrics: { defined: [metric("restart-count")], reused: ["r1-c1.restart-count"] } }, 0));
assert.equal(v.accepted, true);
});
test("提案条数:已收下 M 条再交就退回", async () => {
assert.match(await rejected(proposal(PROPOSAL, 2)), /本阶段你已经收下 2 条提案,每人最多 2 条/);
});
@@ -301,7 +309,7 @@ test("回应拼协议:changes 只改保障时,因子、指标、正文取原
assert.deepEqual(p, {
factors: [factor("多起点", null), factor("扰动", "r1-c1-p2")],
safeguards: ["clip"],
metrics: { defined: [metric("kick-count")], reused: ["restart-count"] },
metrics: { defined: [metric("kick-count")], reused: ["r1-c1.restart-count"] },
body: "提案正文",
clauses: ["条款一"],
});
@@ -402,7 +410,7 @@ test("回应全判否:收下,交回拼好的协议和三问的判断", async
assert.deepEqual(v.accepted && v.protocol, {
factors: [factor("多起点", null), factor("扰动", "r1-c1-p2")],
safeguards: ["guard"],
metrics: { defined: [metric("kick-count")], reused: ["restart-count"] },
metrics: { defined: [metric("kick-count")], reused: ["r1-c1.restart-count"] },
body: "新正文",
clauses: ["条款一"],
});