feat: 任务书 08,jev 模块与账本记 Jev 判断
src/jev 3 个文件 515 行:判重、查冻结条款、查代码改动三个函数,九问问法和阈值照参考项目,只改说法和字段名,阈值注明未在新项目材料上校准,等真实数据。 新增 npm run test:jev(真实 Jev 三处各问一次)。vocab 加 JevJudgment。 ledger 表结构版本 3:callEnded 四种结局对上 agents,墙钟时间用 Measured(恢复时补写出错、原因"进程中断"、测不到);退回、提交记录都带 jev。 config 加必填的 models.jev。 用户原话:"这次就给提交记录加一个和退回记录同样的 Jev 判断字段";"墙钟时间改用 Measured,恢复时写出错加测不到(原因'进程中断')"。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+31
-8
@@ -2,7 +2,9 @@ import { Type, type Static, type TSchema } from "typebox";
|
||||
import { Value } from "typebox/value";
|
||||
import {
|
||||
Id,
|
||||
JevJudgment,
|
||||
JudgedResult,
|
||||
Measured,
|
||||
ModelUsage,
|
||||
ProcessResult,
|
||||
Range,
|
||||
@@ -26,6 +28,11 @@ const Round = Type.Integer({ minimum: 0 });
|
||||
const Version = Type.Integer({ minimum: 1 });
|
||||
const Seq = Type.Integer({ minimum: 1 });
|
||||
const OptionalId = Type.Union([Id, Type.Null()]);
|
||||
/**
|
||||
* 这件事用到的 Jev 判断,原样存(docs/结构.md 第四部分:Jev 不单独成记录,记在它判断的那件事里)。
|
||||
* 一次可能问好几问(如冻结条款三问、代码改动五问),所以是数组,至少一条;没用到 Jev 的写 null。
|
||||
*/
|
||||
const JevUsed = Type.Union([Type.Array(JevJudgment, { minItems: 1 }), Type.Null()]);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 提交(记录 3)
|
||||
@@ -64,16 +71,24 @@ type StoredBody<K extends SubmissionKind> = K extends "proposal"
|
||||
? Omit<Submission<"proposal">, "authorEstimate">
|
||||
: Submission<K>;
|
||||
|
||||
/** 一份提交的一版。version 从 1 起,替换时加 1,被替换的就是上一版。 */
|
||||
/**
|
||||
* 一份提交的一版。version 从 1 起,替换时加 1,被替换的就是上一版。
|
||||
* jev 是收下这一版时用到的 Jev 判断(判"否"才收下,原始概率也存),没用到 Jev 的为 null。
|
||||
*/
|
||||
type SubmissionOf<Body extends Record<SubmissionKind, unknown>> = {
|
||||
[K in SubmissionKind]: Omit<SubmissionSlot, "kind"> & { version: number; kind: K; content: Body[K] };
|
||||
[K in SubmissionKind]: Omit<SubmissionSlot, "kind"> & {
|
||||
version: number;
|
||||
kind: K;
|
||||
content: Body[K];
|
||||
jev: Static<typeof JevUsed>;
|
||||
};
|
||||
}[SubmissionKind];
|
||||
|
||||
export type StoredSubmission = SubmissionOf<{ [K in SubmissionKind]: StoredBody<K> }>;
|
||||
/** 写入时交给 ledger 的提交:提案带着作者自评。 */
|
||||
export type SubmissionInput = SubmissionOf<{ [K in SubmissionKind]: Submission<K> }>;
|
||||
|
||||
/** 某种提交一版的完整字段定义:外层的位置和版本号,加上按提交种类检查的 content。 */
|
||||
/** 某种提交一版的完整字段定义:外层的位置、版本号和 Jev 判断,加上按提交种类检查的 content。 */
|
||||
function submissionSchema(kind: SubmissionKind, body: TSchema): TSchema {
|
||||
return Type.Object(
|
||||
{
|
||||
@@ -84,6 +99,7 @@ function submissionSchema(kind: SubmissionKind, body: TSchema): TSchema {
|
||||
version: Version,
|
||||
kind: Type.Literal(kind),
|
||||
content: body,
|
||||
jev: JevUsed,
|
||||
},
|
||||
CLOSED,
|
||||
);
|
||||
@@ -115,7 +131,7 @@ export const KINDS = {
|
||||
submission: Type.Unsafe<StoredSubmission>({}),
|
||||
/**
|
||||
* 3 退回:被退回的那份内容原样存(它可能正是因为不合格式才被退回),连同退回理由。
|
||||
* 理由来自 Jev 的,jev 里带原始概率和结论;程序检查退回的,jev 为空。
|
||||
* jev 是这次退回用到的 Jev 判断(见 JevUsed),判"否"的几问也一起存;没用到 Jev 的写 null。
|
||||
*/
|
||||
rejection: Type.Object(
|
||||
{
|
||||
@@ -124,7 +140,7 @@ export const KINDS = {
|
||||
kind: Type.Enum(SUBMISSION_KIND_NAMES, { type: "string" }),
|
||||
submitted: AnyJson,
|
||||
reason: Text,
|
||||
jev: Type.Union([Type.Object({ probabilities: AnyJson, conclusion: AnyJson }, CLOSED), Type.Null()]),
|
||||
jev: JevUsed,
|
||||
},
|
||||
CLOSED,
|
||||
),
|
||||
@@ -183,10 +199,17 @@ export const KINDS = {
|
||||
callStarted: Type.Object({ call: Id, actor: Id, stageId: OptionalId, model: Text, materials: AnyJson }, CLOSED),
|
||||
/** 10 模型调用每次回复的用量,reply 从 1 起。 */
|
||||
callUsage: Type.Object({ call: Id, reply: Type.Integer({ minimum: 1 }), usage: ModelUsage }, CLOSED),
|
||||
/** 10 模型调用结束:正常结束,或失败并写明原因。一次调用只有一条。 */
|
||||
/**
|
||||
* 10 模型调用结束,一次调用只有一条。status 与 agents 的会话结局(SessionEnding)同名同义:
|
||||
* submitted 至少有一份被收下;notSubmitted 模型自己停下、一份都没收下;failed 模型服务报错等;stopped 用户停下。
|
||||
* wallSeconds 是这次调用的墙钟时间(秒),四种结局都有:正常结束时由 agents 测出;
|
||||
* 控制进程中断、恢复时补写的结束记录量不到,写 failed、原因"进程中断",墙钟时间记测不到(docs/结构.md 第四部分,CLAUDE.md"中断后怎么恢复")。
|
||||
*/
|
||||
callEnded: Type.Union([
|
||||
Type.Object({ call: Id, ending: Type.Literal("completed") }, CLOSED),
|
||||
Type.Object({ call: Id, ending: Type.Literal("failed"), reason: Text }, CLOSED),
|
||||
Type.Object({ call: Id, wallSeconds: Measured, status: Type.Literal("submitted") }, CLOSED),
|
||||
Type.Object({ call: Id, wallSeconds: Measured, status: Type.Literal("notSubmitted"), reason: Text }, CLOSED),
|
||||
Type.Object({ call: Id, wallSeconds: Measured, status: Type.Literal("failed"), reason: Text }, CLOSED),
|
||||
Type.Object({ call: Id, wallSeconds: Measured, status: Type.Literal("stopped") }, CLOSED),
|
||||
]),
|
||||
|
||||
/** 11 事件:违规、"按配置跳过"、"没测"及原因、停下的原因、运行状态未知等。event 是事件种类。 */
|
||||
|
||||
Reference in New Issue
Block a user