

























@@ -37,30 +37,6 @@ export type DreamingShadowTrialReport = {
3737markdown: string;
3838};
393940-export type DreamingShadowTrialScoreOptions = {
41-helpfulBoost?: number;
42-neutralDelta?: number;
43-harmfulPenalty?: number;
44-};
45-46-export type DreamingShadowTrialCandidateInput = {
47-key: string;
48-score: number;
49-};
50-51-export type DreamingShadowTrialCandidateScore<T extends DreamingShadowTrialCandidateInput> = {
52-candidate: T;
53-scoreBeforeShadowTrial: number;
54-scoreAfterShadowTrial: number;
55-shadowTrialScoreDelta: number;
56-shadowTrialVerdict: DreamingShadowTrialVerdict;
57-shadowTrialRecommendation: DreamingShadowTrialRecommendation;
58-shadowTrialRiskFlags: string[];
59-shadowTrialEvidenceRefs: string[];
60-rejectedByShadowTrial: boolean;
61-scoringAction: "report-only";
62-};
63-6440function normalizeRequiredText(value: string, label: string): string {
6541const normalized = value.trim().replace(/\s+/g, " ");
6642if (!normalized) {
@@ -78,20 +54,6 @@ function normalizeDataList(values: string[] | undefined): string[] {
7854return (values ?? []).map((value) => value.trim()).filter(Boolean);
7955}
805681-function clampScore(value: number): number {
82-if (!Number.isFinite(value)) {
83-return 0;
84-}
85-return Math.max(0, Math.min(1, value));
86-}
87-88-function normalizeScoreDelta(value: number, fallback: number): number {
89-if (!Number.isFinite(value)) {
90-return fallback;
91-}
92-return Math.max(-1, Math.min(1, value));
93-}
94-9557export function resolveDreamingShadowTrialRecommendation(
9658verdict: DreamingShadowTrialVerdict,
9759): DreamingShadowTrialRecommendation {
@@ -131,19 +93,6 @@ function resolveReportContentHash(params: {
13193return crypto.createHash("sha256").update(seed).digest("hex").slice(0, 12);
13294}
13395134-function resolveDreamingShadowTrialScoreDelta(
135-verdict: DreamingShadowTrialVerdict,
136-options?: DreamingShadowTrialScoreOptions,
137-): number {
138-if (verdict === "helpful") {
139-return normalizeScoreDelta(options?.helpfulBoost ?? 0.04, 0.04);
140-}
141-if (verdict === "harmful") {
142-return normalizeScoreDelta(options?.harmfulPenalty ?? -1, -1);
143-}
144-return normalizeScoreDelta(options?.neutralDelta ?? 0, 0);
145-}
146-14796export function defaultDreamingShadowTrialReportPath(params: {
14897workspaceDir: string;
14998candidate: string;
@@ -280,68 +229,6 @@ export function buildDreamingShadowTrialReport(
280229};
281230}
282231283-export function scoreDreamingShadowTrialCandidate<T extends DreamingShadowTrialCandidateInput>(
284-candidate: T,
285-report: Pick<
286-DreamingShadowTrialReport,
287-"verdict" | "recommendation" | "riskFlags" | "evidenceRefs"
288->,
289-options?: DreamingShadowTrialScoreOptions,
290-): DreamingShadowTrialCandidateScore<T> {
291-const scoreBeforeShadowTrial = clampScore(candidate.score);
292-const shadowTrialScoreDelta = resolveDreamingShadowTrialScoreDelta(report.verdict, options);
293-const rejectedByShadowTrial = report.verdict === "harmful" || report.recommendation === "reject";
294-const scoreAfterShadowTrial = rejectedByShadowTrial
295- ? 0
296- : clampScore(scoreBeforeShadowTrial + shadowTrialScoreDelta);
297-298-return {
299- candidate,
300- scoreBeforeShadowTrial,
301- scoreAfterShadowTrial,
302- shadowTrialScoreDelta,
303-shadowTrialVerdict: report.verdict,
304-shadowTrialRecommendation: report.recommendation,
305-shadowTrialRiskFlags: normalizeDataList(report.riskFlags),
306-shadowTrialEvidenceRefs: normalizeDataList(report.evidenceRefs),
307- rejectedByShadowTrial,
308-scoringAction: "report-only",
309-};
310-}
311-312-export function rankDreamingShadowTrialCandidates<T extends DreamingShadowTrialCandidateInput>(
313-candidates: readonly T[],
314-reportsByCandidateKey: ReadonlyMap<string, DreamingShadowTrialReport>,
315-options?: DreamingShadowTrialScoreOptions,
316-): DreamingShadowTrialCandidateScore<T>[] {
317-return candidates
318-.map((candidate) => {
319-const report = reportsByCandidateKey.get(candidate.key);
320-if (!report) {
321-const score = clampScore(candidate.score);
322-return {
323- candidate,
324-scoreBeforeShadowTrial: score,
325-scoreAfterShadowTrial: score,
326-shadowTrialScoreDelta: 0,
327-shadowTrialVerdict: "neutral" as const,
328-shadowTrialRecommendation: "defer" as const,
329-shadowTrialRiskFlags: ["not shadow-trialed"],
330-shadowTrialEvidenceRefs: [],
331-rejectedByShadowTrial: false,
332-scoringAction: "report-only" as const,
333-};
334-}
335-return scoreDreamingShadowTrialCandidate(candidate, report, options);
336-})
337-.toSorted((left, right) => {
338-if (left.rejectedByShadowTrial !== right.rejectedByShadowTrial) {
339-return left.rejectedByShadowTrial ? 1 : -1;
340-}
341-return right.scoreAfterShadowTrial - left.scoreAfterShadowTrial;
342-});
343-}
344-345232export async function writeDreamingShadowTrialReport(
346233input: DreamingShadowTrialInput & { workspaceDir: string },
347234): Promise<DreamingShadowTrialReport> {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。