@tenphi/akno-core 0.12.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/default.jsonc +12 -2
- package/dist/bench/graph.d.ts +2 -0
- package/dist/bench/graph.d.ts.map +1 -1
- package/dist/bench/graph.js +4 -0
- package/dist/bench/graph.js.map +1 -1
- package/dist/bench/language-corpus-v10.d.ts +4 -0
- package/dist/bench/language-corpus-v10.d.ts.map +1 -0
- package/dist/bench/language-corpus-v10.js +569 -0
- package/dist/bench/language-corpus-v10.js.map +1 -0
- package/dist/bench/language-corpus-v11.d.ts +4 -0
- package/dist/bench/language-corpus-v11.d.ts.map +1 -0
- package/dist/bench/language-corpus-v11.js +594 -0
- package/dist/bench/language-corpus-v11.js.map +1 -0
- package/dist/bench/language-corpus-v12.d.ts +4 -0
- package/dist/bench/language-corpus-v12.d.ts.map +1 -0
- package/dist/bench/language-corpus-v12.js +584 -0
- package/dist/bench/language-corpus-v12.js.map +1 -0
- package/dist/bench/language-corpus-v13.d.ts +4 -0
- package/dist/bench/language-corpus-v13.d.ts.map +1 -0
- package/dist/bench/language-corpus-v13.js +584 -0
- package/dist/bench/language-corpus-v13.js.map +1 -0
- package/dist/bench/language-corpus-v14.d.ts +4 -0
- package/dist/bench/language-corpus-v14.d.ts.map +1 -0
- package/dist/bench/language-corpus-v14.js +584 -0
- package/dist/bench/language-corpus-v14.js.map +1 -0
- package/dist/bench/language-corpus-v15.d.ts +4 -0
- package/dist/bench/language-corpus-v15.d.ts.map +1 -0
- package/dist/bench/language-corpus-v15.js +305 -0
- package/dist/bench/language-corpus-v15.js.map +1 -0
- package/dist/bench/language-corpus-v16.d.ts +4 -0
- package/dist/bench/language-corpus-v16.d.ts.map +1 -0
- package/dist/bench/language-corpus-v16.js +305 -0
- package/dist/bench/language-corpus-v16.js.map +1 -0
- package/dist/bench/language-corpus-v17.d.ts +4 -0
- package/dist/bench/language-corpus-v17.d.ts.map +1 -0
- package/dist/bench/language-corpus-v17.js +305 -0
- package/dist/bench/language-corpus-v17.js.map +1 -0
- package/dist/bench/language-corpus-v18.d.ts +4 -0
- package/dist/bench/language-corpus-v18.d.ts.map +1 -0
- package/dist/bench/language-corpus-v18.js +305 -0
- package/dist/bench/language-corpus-v18.js.map +1 -0
- package/dist/bench/language-corpus-v19.d.ts +4 -0
- package/dist/bench/language-corpus-v19.d.ts.map +1 -0
- package/dist/bench/language-corpus-v19.js +310 -0
- package/dist/bench/language-corpus-v19.js.map +1 -0
- package/dist/bench/language-corpus-v2.d.ts +12 -0
- package/dist/bench/language-corpus-v2.d.ts.map +1 -0
- package/dist/bench/language-corpus-v2.js +146 -0
- package/dist/bench/language-corpus-v2.js.map +1 -0
- package/dist/bench/language-corpus-v20.d.ts +4 -0
- package/dist/bench/language-corpus-v20.d.ts.map +1 -0
- package/dist/bench/language-corpus-v20.js +310 -0
- package/dist/bench/language-corpus-v20.js.map +1 -0
- package/dist/bench/language-corpus-v21.d.ts +4 -0
- package/dist/bench/language-corpus-v21.d.ts.map +1 -0
- package/dist/bench/language-corpus-v21.js +310 -0
- package/dist/bench/language-corpus-v21.js.map +1 -0
- package/dist/bench/language-corpus-v22.d.ts +4 -0
- package/dist/bench/language-corpus-v22.d.ts.map +1 -0
- package/dist/bench/language-corpus-v22.js +330 -0
- package/dist/bench/language-corpus-v22.js.map +1 -0
- package/dist/bench/language-corpus-v23.d.ts +4 -0
- package/dist/bench/language-corpus-v23.d.ts.map +1 -0
- package/dist/bench/language-corpus-v23.js +203 -0
- package/dist/bench/language-corpus-v23.js.map +1 -0
- package/dist/bench/language-corpus-v3.d.ts +4 -0
- package/dist/bench/language-corpus-v3.d.ts.map +1 -0
- package/dist/bench/language-corpus-v3.js +184 -0
- package/dist/bench/language-corpus-v3.js.map +1 -0
- package/dist/bench/language-corpus-v4.d.ts +4 -0
- package/dist/bench/language-corpus-v4.d.ts.map +1 -0
- package/dist/bench/language-corpus-v4.js +111 -0
- package/dist/bench/language-corpus-v4.js.map +1 -0
- package/dist/bench/language-corpus-v5.d.ts +4 -0
- package/dist/bench/language-corpus-v5.d.ts.map +1 -0
- package/dist/bench/language-corpus-v5.js +111 -0
- package/dist/bench/language-corpus-v5.js.map +1 -0
- package/dist/bench/language-corpus-v6.d.ts +4 -0
- package/dist/bench/language-corpus-v6.d.ts.map +1 -0
- package/dist/bench/language-corpus-v6.js +111 -0
- package/dist/bench/language-corpus-v6.js.map +1 -0
- package/dist/bench/language-corpus-v7.d.ts +4 -0
- package/dist/bench/language-corpus-v7.d.ts.map +1 -0
- package/dist/bench/language-corpus-v7.js +150 -0
- package/dist/bench/language-corpus-v7.js.map +1 -0
- package/dist/bench/language-corpus-v8.d.ts +4 -0
- package/dist/bench/language-corpus-v8.d.ts.map +1 -0
- package/dist/bench/language-corpus-v8.js +150 -0
- package/dist/bench/language-corpus-v8.js.map +1 -0
- package/dist/bench/language-corpus-v9.d.ts +4 -0
- package/dist/bench/language-corpus-v9.d.ts.map +1 -0
- package/dist/bench/language-corpus-v9.js +150 -0
- package/dist/bench/language-corpus-v9.js.map +1 -0
- package/dist/bench/language-corpus.d.ts +20 -0
- package/dist/bench/language-corpus.d.ts.map +1 -0
- package/dist/bench/language-corpus.js +205 -0
- package/dist/bench/language-corpus.js.map +1 -0
- package/dist/bench/language-review.d.ts +286 -0
- package/dist/bench/language-review.d.ts.map +1 -0
- package/dist/bench/language-review.js +605 -0
- package/dist/bench/language-review.js.map +1 -0
- package/dist/bench/language.d.ts +1221 -0
- package/dist/bench/language.d.ts.map +1 -0
- package/dist/bench/language.js +571 -0
- package/dist/bench/language.js.map +1 -0
- package/dist/config/load.js +5 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +3 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/index/derive.d.ts.map +1 -1
- package/dist/index/derive.js +14 -5
- package/dist/index/derive.js.map +1 -1
- package/dist/index/graph.d.ts.map +1 -1
- package/dist/index/graph.js +3 -0
- package/dist/index/graph.js.map +1 -1
- package/dist/index/indexer.d.ts.map +1 -1
- package/dist/index/indexer.js +6 -1
- package/dist/index/indexer.js.map +1 -1
- package/dist/ingest/extract.d.ts.map +1 -1
- package/dist/ingest/extract.js +3 -1
- package/dist/ingest/extract.js.map +1 -1
- package/dist/kb/line-facts.d.ts.map +1 -1
- package/dist/kb/line-facts.js +2 -0
- package/dist/kb/line-facts.js.map +1 -1
- package/dist/kb/managed-lines.d.ts.map +1 -1
- package/dist/kb/managed-lines.js +3 -2
- package/dist/kb/managed-lines.js.map +1 -1
- package/dist/kb/prose.d.ts +12 -0
- package/dist/kb/prose.d.ts.map +1 -0
- package/dist/kb/prose.js +323 -0
- package/dist/kb/prose.js.map +1 -0
- package/dist/maintenance/conflicts.d.ts +1 -1
- package/dist/maintenance/curate.d.ts +1 -0
- package/dist/maintenance/curate.d.ts.map +1 -1
- package/dist/maintenance/curate.js +28 -1
- package/dist/maintenance/curate.js.map +1 -1
- package/dist/maintenance/dream.d.ts.map +1 -1
- package/dist/maintenance/dream.js +6 -1
- package/dist/maintenance/dream.js.map +1 -1
- package/dist/maintenance/plans.d.ts.map +1 -1
- package/dist/maintenance/plans.js +2 -0
- package/dist/maintenance/plans.js.map +1 -1
- package/dist/maintenance/revision-language.d.ts +4 -0
- package/dist/maintenance/revision-language.d.ts.map +1 -0
- package/dist/maintenance/revision-language.js +50 -0
- package/dist/maintenance/revision-language.js.map +1 -0
- package/dist/memory/action-agency.d.ts +5 -0
- package/dist/memory/action-agency.d.ts.map +1 -0
- package/dist/memory/action-agency.js +76 -0
- package/dist/memory/action-agency.js.map +1 -0
- package/dist/memory/clause-ending.d.ts +4 -0
- package/dist/memory/clause-ending.d.ts.map +1 -0
- package/dist/memory/clause-ending.js +6 -0
- package/dist/memory/clause-ending.js.map +1 -0
- package/dist/memory/counterfactual-wording.d.ts +4 -0
- package/dist/memory/counterfactual-wording.d.ts.map +1 -0
- package/dist/memory/counterfactual-wording.js +101 -0
- package/dist/memory/counterfactual-wording.js.map +1 -0
- package/dist/memory/coverage-roles.d.ts +3 -0
- package/dist/memory/coverage-roles.d.ts.map +1 -0
- package/dist/memory/coverage-roles.js +28 -0
- package/dist/memory/coverage-roles.js.map +1 -0
- package/dist/memory/intent.d.ts +1 -0
- package/dist/memory/intent.d.ts.map +1 -1
- package/dist/memory/intent.js +88 -5
- package/dist/memory/intent.js.map +1 -1
- package/dist/memory/named-actor.d.ts +2 -0
- package/dist/memory/named-actor.d.ts.map +1 -0
- package/dist/memory/named-actor.js +9 -0
- package/dist/memory/named-actor.js.map +1 -0
- package/dist/memory/personal-negative-actions.d.ts +3 -0
- package/dist/memory/personal-negative-actions.d.ts.map +1 -0
- package/dist/memory/personal-negative-actions.js +67 -0
- package/dist/memory/personal-negative-actions.js.map +1 -0
- package/dist/memory/projection.d.ts.map +1 -1
- package/dist/memory/projection.js +10 -2
- package/dist/memory/projection.js.map +1 -1
- package/dist/memory/prose-projection.d.ts +6 -0
- package/dist/memory/prose-projection.d.ts.map +1 -0
- package/dist/memory/prose-projection.js +34 -0
- package/dist/memory/prose-projection.js.map +1 -0
- package/dist/memory/report-uncertainty.d.ts +3 -0
- package/dist/memory/report-uncertainty.d.ts.map +1 -0
- package/dist/memory/report-uncertainty.js +67 -0
- package/dist/memory/report-uncertainty.js.map +1 -0
- package/dist/memory/reporting-roles.d.ts +3 -0
- package/dist/memory/reporting-roles.d.ts.map +1 -0
- package/dist/memory/reporting-roles.js +39 -0
- package/dist/memory/reporting-roles.js.map +1 -0
- package/dist/memory/retention-source-frame.d.ts +8 -0
- package/dist/memory/retention-source-frame.d.ts.map +1 -0
- package/dist/memory/retention-source-frame.js +72 -0
- package/dist/memory/retention-source-frame.js.map +1 -0
- package/dist/models/client.d.ts +12 -3
- package/dist/models/client.d.ts.map +1 -1
- package/dist/models/client.js +142 -6
- package/dist/models/client.js.map +1 -1
- package/dist/models/language-audit.d.ts +78 -0
- package/dist/models/language-audit.d.ts.map +1 -0
- package/dist/models/language-audit.js +139 -0
- package/dist/models/language-audit.js.map +1 -0
- package/dist/models/language.d.ts +12 -0
- package/dist/models/language.d.ts.map +1 -0
- package/dist/models/language.js +106 -0
- package/dist/models/language.js.map +1 -0
- package/dist/models/semantic-verdict.d.ts +53 -0
- package/dist/models/semantic-verdict.d.ts.map +1 -0
- package/dist/models/semantic-verdict.js +190 -0
- package/dist/models/semantic-verdict.js.map +1 -0
- package/dist/ops/answer-record-rendering.d.ts +73 -0
- package/dist/ops/answer-record-rendering.d.ts.map +1 -0
- package/dist/ops/answer-record-rendering.js +149 -0
- package/dist/ops/answer-record-rendering.js.map +1 -0
- package/dist/ops/answer-source-audit.d.ts +354 -0
- package/dist/ops/answer-source-audit.d.ts.map +1 -0
- package/dist/ops/answer-source-audit.js +328 -0
- package/dist/ops/answer-source-audit.js.map +1 -0
- package/dist/ops/answer.d.ts +2 -2
- package/dist/ops/answer.d.ts.map +1 -1
- package/dist/ops/answer.js +1032 -114
- package/dist/ops/answer.js.map +1 -1
- package/dist/ops/context.d.ts.map +1 -1
- package/dist/ops/context.js +7 -0
- package/dist/ops/context.js.map +1 -1
- package/dist/ops/graph.d.ts.map +1 -1
- package/dist/ops/graph.js +35 -4
- package/dist/ops/graph.js.map +1 -1
- package/dist/ops/read.d.ts.map +1 -1
- package/dist/ops/read.js +5 -2
- package/dist/ops/read.js.map +1 -1
- package/dist/ops/recall.d.ts.map +1 -1
- package/dist/ops/recall.js +10 -0
- package/dist/ops/recall.js.map +1 -1
- package/dist/ops/remember.d.ts +2 -1
- package/dist/ops/remember.d.ts.map +1 -1
- package/dist/ops/remember.js +48 -33
- package/dist/ops/remember.js.map +1 -1
- package/dist/ops/retain.d.ts +3 -1
- package/dist/ops/retain.d.ts.map +1 -1
- package/dist/ops/retain.js +56 -44
- package/dist/ops/retain.js.map +1 -1
- package/dist/recall/assemble.d.ts +1 -0
- package/dist/recall/assemble.d.ts.map +1 -1
- package/dist/recall/assemble.js +19 -2
- package/dist/recall/assemble.js.map +1 -1
- package/dist/store/db.d.ts.map +1 -1
- package/dist/store/db.js +3 -1
- package/dist/store/db.js.map +1 -1
- package/dist/store/migrations.d.ts +2 -1
- package/dist/store/migrations.d.ts.map +1 -1
- package/dist/store/migrations.js +11 -1
- package/dist/store/migrations.js.map +1 -1
- package/dist/timeline/clock.d.ts.map +1 -1
- package/dist/timeline/clock.js +2 -0
- package/dist/timeline/clock.js.map +1 -1
- package/dist/timeline/eligibility.js +4 -4
- package/dist/timeline/eligibility.js.map +1 -1
- package/dist/timeline/source-clock.d.ts +5 -0
- package/dist/timeline/source-clock.d.ts.map +1 -0
- package/dist/timeline/source-clock.js +179 -0
- package/dist/timeline/source-clock.js.map +1 -0
- package/dist/write/fictional-case-identity.d.ts +10 -0
- package/dist/write/fictional-case-identity.d.ts.map +1 -0
- package/dist/write/fictional-case-identity.js +84 -0
- package/dist/write/fictional-case-identity.js.map +1 -0
- package/dist/write/managed-memory.js +1 -1
- package/dist/write/managed-memory.js.map +1 -1
- package/dist/write/retain-clock-repair.d.ts +48 -0
- package/dist/write/retain-clock-repair.d.ts.map +1 -0
- package/dist/write/retain-clock-repair.js +175 -0
- package/dist/write/retain-clock-repair.js.map +1 -0
- package/dist/write/retain.d.ts +21 -10
- package/dist/write/retain.d.ts.map +1 -1
- package/dist/write/retain.js +1220 -70
- package/dist/write/retain.js.map +1 -1
- package/dist/write/retained-relations.d.ts +7 -0
- package/dist/write/retained-relations.d.ts.map +1 -0
- package/dist/write/retained-relations.js +38 -0
- package/dist/write/retained-relations.js.map +1 -0
- package/dist/write/retained-spans.d.ts +5 -0
- package/dist/write/retained-spans.d.ts.map +1 -0
- package/dist/write/retained-spans.js +30 -0
- package/dist/write/retained-spans.js.map +1 -0
- package/dist/write/retained-time.d.ts +4 -0
- package/dist/write/retained-time.d.ts.map +1 -0
- package/dist/write/retained-time.js +10 -0
- package/dist/write/retained-time.js.map +1 -0
- package/dist/write/retention-frame-audit.d.ts +25 -0
- package/dist/write/retention-frame-audit.d.ts.map +1 -0
- package/dist/write/retention-frame-audit.js +43 -0
- package/dist/write/retention-frame-audit.js.map +1 -0
- package/dist/write/retention-negative-evidence.d.ts +222 -0
- package/dist/write/retention-negative-evidence.d.ts.map +1 -0
- package/dist/write/retention-negative-evidence.js +122 -0
- package/dist/write/retention-negative-evidence.js.map +1 -0
- package/dist/write/retention-report-limits.d.ts +65 -0
- package/dist/write/retention-report-limits.d.ts.map +1 -0
- package/dist/write/retention-report-limits.js +71 -0
- package/dist/write/retention-report-limits.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MemoryQualification } from '@tenphi/akno-protocol';
|
|
3
|
+
import { sha256 } from "../store/ids.js";
|
|
4
|
+
import { LANGUAGE_CORPUS_V3 } from "./language-corpus-v3.js";
|
|
5
|
+
import { LANGUAGE_CORPUS_V7 } from "./language-corpus-v7.js";
|
|
6
|
+
import { LANGUAGE_CORPUS_V8 } from "./language-corpus-v8.js";
|
|
7
|
+
import { LANGUAGE_CORPUS_V9 } from "./language-corpus-v9.js";
|
|
8
|
+
import { LANGUAGE_CORPUS_V10 } from "./language-corpus-v10.js";
|
|
9
|
+
import { LANGUAGE_CORPUS_V11 } from "./language-corpus-v11.js";
|
|
10
|
+
import { LANGUAGE_CORPUS_V12 } from "./language-corpus-v12.js";
|
|
11
|
+
import { LANGUAGE_CORPUS_V13 } from "./language-corpus-v13.js";
|
|
12
|
+
import { LANGUAGE_CORPUS_V14 } from "./language-corpus-v14.js";
|
|
13
|
+
import { LANGUAGE_CORPUS_V15 } from "./language-corpus-v15.js";
|
|
14
|
+
import { LANGUAGE_CORPUS_V16 } from "./language-corpus-v16.js";
|
|
15
|
+
import { LANGUAGE_CORPUS_V17 } from "./language-corpus-v17.js";
|
|
16
|
+
import { LANGUAGE_CORPUS_V18 } from "./language-corpus-v18.js";
|
|
17
|
+
import { LANGUAGE_CORPUS_V19 } from "./language-corpus-v19.js";
|
|
18
|
+
import { LANGUAGE_CORPUS_V20 } from "./language-corpus-v20.js";
|
|
19
|
+
import { LANGUAGE_CORPUS_V21 } from "./language-corpus-v21.js";
|
|
20
|
+
import { LANGUAGE_CORPUS_V22 } from "./language-corpus-v22.js";
|
|
21
|
+
import { LANGUAGE_CORPUS_V23 } from "./language-corpus-v23.js";
|
|
22
|
+
import { LANGUAGE_CORPUS_V6 } from "./language-corpus-v6.js";
|
|
23
|
+
import { LANGUAGE_CORPUS_V5 } from "./language-corpus-v5.js";
|
|
24
|
+
import { LANGUAGE_CORPUS_V4 } from "./language-corpus-v4.js";
|
|
25
|
+
import { ANSWER_PROMPT_VERSION, ANSWER_VERIFIER_PROMPT_VERSION } from "../ops/answer.js";
|
|
26
|
+
import { RETAIN_PROMPT_VERSION, RETAIN_VERIFIER_VERSION } from "../write/retain.js";
|
|
27
|
+
import { PROSE_PROJECTION_VERSION } from "../kb/prose.js";
|
|
28
|
+
import { MEMORY_VIEW_VERSION } from "../memory/intent.js";
|
|
29
|
+
const ReviewEvidence = z.object({
|
|
30
|
+
text: z.string().trim().min(1),
|
|
31
|
+
qualification: MemoryQualification.refine((value) => value.status === 'qualified'),
|
|
32
|
+
});
|
|
33
|
+
const ReviewMaterial = z.object({
|
|
34
|
+
retainedItems: z.number().int().nonnegative(),
|
|
35
|
+
reviewKnowledge: z.array(ReviewEvidence),
|
|
36
|
+
queries: z.array(z.object({
|
|
37
|
+
retainedEvidence: z.number().int().nonnegative(),
|
|
38
|
+
reviewRetrieval: z.array(ReviewEvidence),
|
|
39
|
+
})),
|
|
40
|
+
});
|
|
41
|
+
const Reviewer = z.object({
|
|
42
|
+
kind: z.enum(['human', 'model']),
|
|
43
|
+
id: z.string().min(1),
|
|
44
|
+
independent: z.literal(true),
|
|
45
|
+
didNotAuthorCorpus: z.literal(true),
|
|
46
|
+
didNotTuneRuntime: z.literal(true),
|
|
47
|
+
});
|
|
48
|
+
const InputReview = z.object({
|
|
49
|
+
schemaVersion: z.literal('language-input-review-v1'),
|
|
50
|
+
corpusFingerprint: z.string(),
|
|
51
|
+
reviewer: Reviewer.extend({ reviewedWithoutOutputs: z.literal(true) }),
|
|
52
|
+
cases: z.array(z.object({ id: z.string(), approved: z.boolean(), reason: z.string().min(1) })),
|
|
53
|
+
});
|
|
54
|
+
const AnswerReview = z.object({
|
|
55
|
+
queryLanguage: z.enum(['en', 'ru']),
|
|
56
|
+
answerLanguage: z.enum(['en', 'ru']),
|
|
57
|
+
explicitView: z.boolean(),
|
|
58
|
+
usefulQualifiedAnswer: z.boolean(),
|
|
59
|
+
usefulQualifiedRetrieval: z.boolean(),
|
|
60
|
+
justifiedAbstention: z.boolean(),
|
|
61
|
+
languageCompliant: z.boolean().nullable(),
|
|
62
|
+
qualificationPreserved: z.boolean(),
|
|
63
|
+
unsafeFactualPromotion: z.boolean(),
|
|
64
|
+
reason: z.string().min(1),
|
|
65
|
+
});
|
|
66
|
+
const RetentionReview = z.object({
|
|
67
|
+
id: z.string(),
|
|
68
|
+
run: z.number().int().positive(),
|
|
69
|
+
retentionUseful: z.boolean(),
|
|
70
|
+
retentionJustifiedHold: z.boolean(),
|
|
71
|
+
knowledgeLanguageCompliant: z.boolean(),
|
|
72
|
+
qualificationPreserved: z.boolean(),
|
|
73
|
+
unsafeFactualPromotion: z.boolean(),
|
|
74
|
+
reason: z.string().min(1),
|
|
75
|
+
answers: z.array(AnswerReview).length(8),
|
|
76
|
+
});
|
|
77
|
+
const OutputReviewV1 = z.object({
|
|
78
|
+
schemaVersion: z.literal('language-output-review-v1'),
|
|
79
|
+
packetFingerprint: z.string(),
|
|
80
|
+
reviewer: Reviewer,
|
|
81
|
+
cases: z.array(RetentionReview),
|
|
82
|
+
});
|
|
83
|
+
const OutputReviewV2 = OutputReviewV1.extend({
|
|
84
|
+
schemaVersion: z.literal('language-output-review-v2'),
|
|
85
|
+
cases: z.array(RetentionReview.extend({
|
|
86
|
+
retainedSourceEntailed: z.boolean(),
|
|
87
|
+
answers: z.array(AnswerReview.extend({ sourceEntailed: z.boolean().nullable() })).length(8),
|
|
88
|
+
})),
|
|
89
|
+
});
|
|
90
|
+
const OutputReview = z.discriminatedUnion('schemaVersion', [OutputReviewV1, OutputReviewV2]);
|
|
91
|
+
/** The packet excludes runtime verifier decisions and aggregate scores from semantic adjudication. */
|
|
92
|
+
export function languageReviewPacket(reports, rawInputReview) {
|
|
93
|
+
const inputReview = InputReview.parse(rawInputReview);
|
|
94
|
+
const corpusVersion = reports[0]?.corpusVersion;
|
|
95
|
+
const corpus = corpusVersion === 'language-discourse-v3'
|
|
96
|
+
? LANGUAGE_CORPUS_V3
|
|
97
|
+
: corpusVersion === 'language-discourse-v4'
|
|
98
|
+
? LANGUAGE_CORPUS_V4
|
|
99
|
+
: corpusVersion === 'language-discourse-v5'
|
|
100
|
+
? LANGUAGE_CORPUS_V5
|
|
101
|
+
: corpusVersion === 'language-discourse-v6'
|
|
102
|
+
? LANGUAGE_CORPUS_V6
|
|
103
|
+
: corpusVersion === 'language-discourse-v7'
|
|
104
|
+
? LANGUAGE_CORPUS_V7
|
|
105
|
+
: corpusVersion === 'language-discourse-v8'
|
|
106
|
+
? LANGUAGE_CORPUS_V8
|
|
107
|
+
: corpusVersion === 'language-discourse-v9'
|
|
108
|
+
? LANGUAGE_CORPUS_V9
|
|
109
|
+
: corpusVersion === 'language-discourse-v10'
|
|
110
|
+
? LANGUAGE_CORPUS_V10
|
|
111
|
+
: corpusVersion === 'language-discourse-v11'
|
|
112
|
+
? LANGUAGE_CORPUS_V11
|
|
113
|
+
: corpusVersion === 'language-discourse-v12'
|
|
114
|
+
? LANGUAGE_CORPUS_V12
|
|
115
|
+
: corpusVersion === 'language-discourse-v13'
|
|
116
|
+
? LANGUAGE_CORPUS_V13
|
|
117
|
+
: corpusVersion === 'language-discourse-v14'
|
|
118
|
+
? LANGUAGE_CORPUS_V14
|
|
119
|
+
: corpusVersion === 'language-discourse-v15'
|
|
120
|
+
? LANGUAGE_CORPUS_V15
|
|
121
|
+
: corpusVersion === 'language-discourse-v16'
|
|
122
|
+
? LANGUAGE_CORPUS_V16
|
|
123
|
+
: corpusVersion === 'language-discourse-v17'
|
|
124
|
+
? LANGUAGE_CORPUS_V17
|
|
125
|
+
: corpusVersion === 'language-discourse-v18'
|
|
126
|
+
? LANGUAGE_CORPUS_V18
|
|
127
|
+
: corpusVersion === 'language-discourse-v19'
|
|
128
|
+
? LANGUAGE_CORPUS_V19
|
|
129
|
+
: corpusVersion === 'language-discourse-v20'
|
|
130
|
+
? LANGUAGE_CORPUS_V20
|
|
131
|
+
: corpusVersion === 'language-discourse-v21'
|
|
132
|
+
? LANGUAGE_CORPUS_V21
|
|
133
|
+
: corpusVersion === 'language-discourse-v22'
|
|
134
|
+
? LANGUAGE_CORPUS_V22
|
|
135
|
+
: corpusVersion === 'language-discourse-v23'
|
|
136
|
+
? LANGUAGE_CORPUS_V23
|
|
137
|
+
: null;
|
|
138
|
+
if (!corpus)
|
|
139
|
+
throw new Error('unexpected corpus');
|
|
140
|
+
const fingerprint = sha256(JSON.stringify(corpus));
|
|
141
|
+
if (inputReview.corpusFingerprint !== fingerprint)
|
|
142
|
+
throw new Error('stale input review');
|
|
143
|
+
exactIds(inputReview.cases.map((entry) => entry.id), corpus.map((entry) => entry.id));
|
|
144
|
+
if (inputReview.cases.some((entry) => !entry.approved))
|
|
145
|
+
throw new Error('input expectations not approved');
|
|
146
|
+
if (reports.length !== 2 || new Set(reports.map((report) => report.split)).size !== 2)
|
|
147
|
+
throw new Error('both splits required');
|
|
148
|
+
const first = reports[0];
|
|
149
|
+
for (const report of reports) {
|
|
150
|
+
if (report.schemaVersion !== 'language-benchmark-v2')
|
|
151
|
+
throw new Error('unexpected report schema');
|
|
152
|
+
if (report.corpusFingerprint !== fingerprint || report.corpusVersion !== corpusVersion)
|
|
153
|
+
throw new Error('unexpected corpus');
|
|
154
|
+
if (!Number.isInteger(report.runs) || report.runs < 2 || report.runs > 5 || report.runs !== first.runs)
|
|
155
|
+
throw new Error('at least two complete equal run sets required');
|
|
156
|
+
if (JSON.stringify(contract(report)) !== JSON.stringify(contract(first)))
|
|
157
|
+
throw new Error('runtime contracts differ');
|
|
158
|
+
if (report.knowledgeLanguage !== 'en' ||
|
|
159
|
+
report.setup !== 'separate-writable-fidelity-and-read-only-admission')
|
|
160
|
+
throw new Error('unexpected evaluation setup');
|
|
161
|
+
const expected = corpus.filter((entry) => entry.split === report.split);
|
|
162
|
+
exactIds(report.selectedCaseIds, expected.map((entry) => entry.id));
|
|
163
|
+
exactIds(report.cases.map((entry) => `${entry.id}/${entry.run}`), expected.flatMap((entry) => Array.from({ length: report.runs }, (_, index) => `${entry.id}/${index + 1}`)));
|
|
164
|
+
for (const entry of report.cases) {
|
|
165
|
+
// Reports arrive from JSON, not a typed caller. Missing output must not become a
|
|
166
|
+
// present answer through undefined !== null and inflate independently reviewed coverage.
|
|
167
|
+
if (entry.queries.some((query) => query.reviewAnswer !== null &&
|
|
168
|
+
(typeof query.reviewAnswer !== 'string' || query.reviewAnswer.trim().length === 0)))
|
|
169
|
+
throw new Error('missing or invalid answer review evidence');
|
|
170
|
+
if (typeof entry.availabilityFailure !== 'boolean')
|
|
171
|
+
throw new Error('missing availability observation');
|
|
172
|
+
if (!ReviewMaterial.safeParse(entry).success)
|
|
173
|
+
throw new Error('missing or malformed retained/retrieval review evidence');
|
|
174
|
+
const source = expected.find((candidate) => candidate.id === entry.id);
|
|
175
|
+
if ([
|
|
176
|
+
'language-discourse-v10',
|
|
177
|
+
'language-discourse-v11',
|
|
178
|
+
'language-discourse-v12',
|
|
179
|
+
'language-discourse-v13',
|
|
180
|
+
'language-discourse-v14',
|
|
181
|
+
'language-discourse-v15',
|
|
182
|
+
'language-discourse-v16',
|
|
183
|
+
'language-discourse-v17',
|
|
184
|
+
'language-discourse-v18',
|
|
185
|
+
'language-discourse-v19',
|
|
186
|
+
'language-discourse-v20',
|
|
187
|
+
'language-discourse-v21',
|
|
188
|
+
'language-discourse-v22',
|
|
189
|
+
'language-discourse-v23',
|
|
190
|
+
].includes(corpusVersion) &&
|
|
191
|
+
(entry.language !== source.language || entry.scenario !== source.scenario))
|
|
192
|
+
throw new Error('altered source dimensions');
|
|
193
|
+
if (entry.expectedHold !== (source.hold ?? false))
|
|
194
|
+
throw new Error('altered hold expectation');
|
|
195
|
+
exactIds(entry.queries.map(queryKey), matrixKeys());
|
|
196
|
+
if (entry.retainedItems !== entry.reviewKnowledge.length)
|
|
197
|
+
throw new Error('inconsistent retained count');
|
|
198
|
+
if (entry.queries.some((query) => !query.reviewRetrieval || query.retainedEvidence !== query.reviewRetrieval.length))
|
|
199
|
+
throw new Error('missing or inconsistent retrieval review evidence');
|
|
200
|
+
const retrievals = new Map();
|
|
201
|
+
for (const query of entry.queries) {
|
|
202
|
+
const key = `${query.queryLanguage}/${query.explicitView}`;
|
|
203
|
+
const evidence = JSON.stringify(query.reviewRetrieval);
|
|
204
|
+
if (retrievals.has(key) && retrievals.get(key) !== evidence)
|
|
205
|
+
throw new Error('retrieval cannot differ by answer language');
|
|
206
|
+
retrievals.set(key, evidence);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
separateReviewer(inputReview.reviewer, report);
|
|
210
|
+
}
|
|
211
|
+
const packet = {
|
|
212
|
+
schemaVersion: [
|
|
213
|
+
'language-discourse-v13',
|
|
214
|
+
'language-discourse-v14',
|
|
215
|
+
'language-discourse-v15',
|
|
216
|
+
'language-discourse-v16',
|
|
217
|
+
'language-discourse-v17',
|
|
218
|
+
'language-discourse-v18',
|
|
219
|
+
'language-discourse-v19',
|
|
220
|
+
'language-discourse-v20',
|
|
221
|
+
'language-discourse-v21',
|
|
222
|
+
'language-discourse-v22',
|
|
223
|
+
'language-discourse-v23',
|
|
224
|
+
].includes(corpusVersion)
|
|
225
|
+
? 'language-review-packet-v2'
|
|
226
|
+
: 'language-review-packet-v1',
|
|
227
|
+
corpusFingerprint: fingerprint,
|
|
228
|
+
inputReviewFingerprint: sha256(JSON.stringify(inputReview)),
|
|
229
|
+
reportFingerprints: reports.map((report) => sha256(JSON.stringify(report))).sort(),
|
|
230
|
+
contract: contract(first),
|
|
231
|
+
instructions: 'Judge source entailment and useful records, not world truth. English is required for generated knowledge. Answer prose must follow its requested language; original names and citations may remain exact. A null answer is not a useful answer; judge its abstention separately. Read-only admission requires a hold. All qualifications must survive together, including nested attribution, fiction, incompatible alternatives and unknown source-relative time. Runtime verifier agreement is not an independent truth label.' +
|
|
232
|
+
([
|
|
233
|
+
'language-discourse-v12',
|
|
234
|
+
'language-discourse-v13',
|
|
235
|
+
'language-discourse-v14',
|
|
236
|
+
'language-discourse-v15',
|
|
237
|
+
'language-discourse-v16',
|
|
238
|
+
'language-discourse-v17',
|
|
239
|
+
'language-discourse-v18',
|
|
240
|
+
'language-discourse-v19',
|
|
241
|
+
'language-discourse-v20',
|
|
242
|
+
'language-discourse-v21',
|
|
243
|
+
'language-discourse-v22',
|
|
244
|
+
'language-discourse-v23',
|
|
245
|
+
].includes(corpusVersion)
|
|
246
|
+
? ' Typed commitment describes the embedded proposition, not certainty that a discussion happened. Competing unconfirmed causes must remain tentative or hypothetical and must not gain ordinary factual/current eligibility. self_attested records direct user provenance; it is neither independent verification nor a requirement to verbalize self-attestation. Preserve corrective contrasts tied to the retained proposition, while unrelated adjacent details may be omitted.'
|
|
247
|
+
: '') +
|
|
248
|
+
([
|
|
249
|
+
'language-discourse-v13',
|
|
250
|
+
'language-discourse-v14',
|
|
251
|
+
'language-discourse-v15',
|
|
252
|
+
'language-discourse-v16',
|
|
253
|
+
'language-discourse-v17',
|
|
254
|
+
'language-discourse-v18',
|
|
255
|
+
'language-discourse-v19',
|
|
256
|
+
'language-discourse-v20',
|
|
257
|
+
'language-discourse-v21',
|
|
258
|
+
'language-discourse-v22',
|
|
259
|
+
'language-discourse-v23',
|
|
260
|
+
].includes(corpusVersion)
|
|
261
|
+
? ' Return language-output-review-v2. Retained sets require retainedSourceEntailed:boolean: every saved proposition must be entailed in content and scope by the frozen original source; empty sets are vacuously true. Every answer requires sourceEntailed:boolean|null, null if and only if the answer is null. A nonnull answer must be entailed by the original source even when it repeats a flawed retained record. Preserve qualification separately: asserted + source_report + explicit unverified prose can faithfully represent an asserted report without independent verification. Service provision is not an instantiated booking. A focused entailed subset may omit unrelated details; explicit rejected-offer wording answers which offer was rejected without repeating the redundant no-plan clause. Omission affects usefulness unless it changes a coupled scope qualification. Any source-unfaithful accepted record or nonnull answer fails the gate, regardless of coverage.'
|
|
262
|
+
: ''),
|
|
263
|
+
cases: reports.flatMap((report) => report.cases.map((entry) => ({
|
|
264
|
+
id: entry.id,
|
|
265
|
+
run: entry.run,
|
|
266
|
+
source: corpus.find((source) => source.id === entry.id),
|
|
267
|
+
reviewKnowledge: entry.reviewKnowledge,
|
|
268
|
+
answers: entry.queries.map((query) => ({
|
|
269
|
+
queryLanguage: query.queryLanguage,
|
|
270
|
+
answerLanguage: query.requestedAnswerLanguage,
|
|
271
|
+
explicitView: query.explicitView,
|
|
272
|
+
retrievedEvidence: query.reviewRetrieval,
|
|
273
|
+
answer: query.reviewAnswer,
|
|
274
|
+
})),
|
|
275
|
+
}))),
|
|
276
|
+
};
|
|
277
|
+
return { ...packet, packetFingerprint: sha256(JSON.stringify(packet)) };
|
|
278
|
+
}
|
|
279
|
+
const LANGUAGE_GATE_THRESHOLDS = {
|
|
280
|
+
unsafeFactualPromotion: 0,
|
|
281
|
+
acceptedLanguageViolations: 0,
|
|
282
|
+
translationQualificationErrors: 0,
|
|
283
|
+
sourceByteChanges: 0,
|
|
284
|
+
usefulRetentionCoverage: 0.8,
|
|
285
|
+
qualifiedRetrievalCoverage: 0.8,
|
|
286
|
+
usefulQualifiedAnswerCoverage: 0.8,
|
|
287
|
+
availabilityFailureRate: 0.05,
|
|
288
|
+
};
|
|
289
|
+
/** Historical trials keep their original policy; the broader corpus declares its stronger target
|
|
290
|
+
* before execution. Never accept a report-supplied threshold as authority for passing a gate. */
|
|
291
|
+
export function languageGateThresholds(corpusVersion) {
|
|
292
|
+
return {
|
|
293
|
+
...LANGUAGE_GATE_THRESHOLDS,
|
|
294
|
+
...([
|
|
295
|
+
'language-discourse-v13',
|
|
296
|
+
'language-discourse-v14',
|
|
297
|
+
'language-discourse-v15',
|
|
298
|
+
'language-discourse-v16',
|
|
299
|
+
'language-discourse-v17',
|
|
300
|
+
'language-discourse-v18',
|
|
301
|
+
'language-discourse-v19',
|
|
302
|
+
'language-discourse-v20',
|
|
303
|
+
'language-discourse-v21',
|
|
304
|
+
'language-discourse-v22',
|
|
305
|
+
'language-discourse-v23',
|
|
306
|
+
].includes(corpusVersion)
|
|
307
|
+
? { unsupportedRetainedOutputs: 0, unsupportedNonnullAnswers: 0 }
|
|
308
|
+
: {}),
|
|
309
|
+
usefulQualifiedAnswerCoverage: [
|
|
310
|
+
'language-discourse-v10',
|
|
311
|
+
'language-discourse-v11',
|
|
312
|
+
'language-discourse-v12',
|
|
313
|
+
'language-discourse-v13',
|
|
314
|
+
'language-discourse-v14',
|
|
315
|
+
'language-discourse-v15',
|
|
316
|
+
'language-discourse-v16',
|
|
317
|
+
'language-discourse-v17',
|
|
318
|
+
'language-discourse-v18',
|
|
319
|
+
'language-discourse-v19',
|
|
320
|
+
'language-discourse-v20',
|
|
321
|
+
'language-discourse-v21',
|
|
322
|
+
'language-discourse-v22',
|
|
323
|
+
'language-discourse-v23',
|
|
324
|
+
].includes(corpusVersion)
|
|
325
|
+
? 0.9
|
|
326
|
+
: 0.8,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
/** Fail closed on missing, duplicated, stale, or internally contradictory adjudication. */
|
|
330
|
+
export function adjudicateLanguageGate(reports, inputReview, rawOutputReview) {
|
|
331
|
+
const packet = languageReviewPacket(reports, inputReview);
|
|
332
|
+
const thresholds = languageGateThresholds(reports[0].corpusVersion);
|
|
333
|
+
const review = OutputReview.parse(rawOutputReview);
|
|
334
|
+
const requiresEntailment = [
|
|
335
|
+
'language-discourse-v13',
|
|
336
|
+
'language-discourse-v14',
|
|
337
|
+
'language-discourse-v15',
|
|
338
|
+
'language-discourse-v16',
|
|
339
|
+
'language-discourse-v17',
|
|
340
|
+
'language-discourse-v18',
|
|
341
|
+
'language-discourse-v19',
|
|
342
|
+
'language-discourse-v20',
|
|
343
|
+
'language-discourse-v21',
|
|
344
|
+
'language-discourse-v22',
|
|
345
|
+
'language-discourse-v23',
|
|
346
|
+
].includes(reports[0].corpusVersion);
|
|
347
|
+
if (review.schemaVersion !== (requiresEntailment ? 'language-output-review-v2' : 'language-output-review-v1'))
|
|
348
|
+
throw new Error('unexpected output review schema for corpus');
|
|
349
|
+
if (review.packetFingerprint !== packet.packetFingerprint)
|
|
350
|
+
throw new Error('stale output review');
|
|
351
|
+
for (const report of reports)
|
|
352
|
+
separateReviewer(review.reviewer, report);
|
|
353
|
+
exactIds(review.cases.map((entry) => `${entry.id}/${entry.run}`), packet.cases.map((entry) => `${entry.id}/${entry.run}`));
|
|
354
|
+
const failures = [];
|
|
355
|
+
if (reports.some((report) => report.answerPromptVersion !== ANSWER_PROMPT_VERSION ||
|
|
356
|
+
report.answerVerifierVersion !== ANSWER_VERIFIER_PROMPT_VERSION ||
|
|
357
|
+
report.retentionPromptVersion !== RETAIN_PROMPT_VERSION ||
|
|
358
|
+
report.retentionVerifierVersion !== RETAIN_VERIFIER_VERSION ||
|
|
359
|
+
report.proseProjectionVersion !== PROSE_PROJECTION_VERSION ||
|
|
360
|
+
report.memoryViewVersion !== MEMORY_VIEW_VERSION))
|
|
361
|
+
failures.push('stale_runtime_contract');
|
|
362
|
+
const groups = reports.flatMap((report) => Array.from({ length: report.runs }, (_, index) => {
|
|
363
|
+
const run = index + 1;
|
|
364
|
+
const observations = report.cases.filter((entry) => entry.run === run);
|
|
365
|
+
const useful = observations.filter((entry) => !entry.expectedHold);
|
|
366
|
+
let retained = 0, safeHolds = 0, usefulAnswers = 0, usefulRetrievals = 0, justifiedAbstentions = 0;
|
|
367
|
+
let promotions = 0, languageErrors = 0, qualificationErrors = 0, unsupportedRetainedOutputs = 0, unsupportedNonnullAnswers = 0;
|
|
368
|
+
for (const observation of observations) {
|
|
369
|
+
const judgment = review.cases.find((entry) => entry.id === observation.id && entry.run === run);
|
|
370
|
+
exactIds(judgment.answers.map(answerKey), matrixKeys());
|
|
371
|
+
if ((judgment.retentionUseful && observation.retainedItems === 0) ||
|
|
372
|
+
(judgment.retentionJustifiedHold && observation.retainedItems > 0) ||
|
|
373
|
+
(judgment.retentionUseful && judgment.retentionJustifiedHold))
|
|
374
|
+
throw new Error('inconsistent retention judgment');
|
|
375
|
+
if (requiresEntailment) {
|
|
376
|
+
if (!('retainedSourceEntailed' in judgment))
|
|
377
|
+
throw new Error('missing retained source entailment');
|
|
378
|
+
if (!judgment.retainedSourceEntailed) {
|
|
379
|
+
// A useful retained set can still contain an additional unsupported proposition.
|
|
380
|
+
if (!observation.retainedItems)
|
|
381
|
+
throw new Error('inconsistent retained source entailment');
|
|
382
|
+
unsupportedRetainedOutputs++;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (judgment.retentionUseful && !observation.expectedHold)
|
|
386
|
+
retained++;
|
|
387
|
+
if (judgment.retentionJustifiedHold && observation.expectedHold)
|
|
388
|
+
safeHolds++;
|
|
389
|
+
if (judgment.unsafeFactualPromotion)
|
|
390
|
+
promotions++;
|
|
391
|
+
if (!judgment.knowledgeLanguageCompliant)
|
|
392
|
+
languageErrors++;
|
|
393
|
+
if (!judgment.qualificationPreserved)
|
|
394
|
+
qualificationErrors++;
|
|
395
|
+
const retrievalJudgments = new Map();
|
|
396
|
+
for (const query of observation.queries) {
|
|
397
|
+
const answer = judgment.answers.find((entry) => answerKey(entry) === queryKey(query));
|
|
398
|
+
const present = query.reviewAnswer !== null;
|
|
399
|
+
if (answer.usefulQualifiedRetrieval && query.reviewRetrieval.length === 0)
|
|
400
|
+
throw new Error('inconsistent retrieval judgment');
|
|
401
|
+
if ((!present && answer.usefulQualifiedAnswer) ||
|
|
402
|
+
(present && answer.justifiedAbstention) ||
|
|
403
|
+
(present && answer.languageCompliant === null) ||
|
|
404
|
+
(!present && answer.languageCompliant !== null))
|
|
405
|
+
throw new Error('inconsistent answer judgment');
|
|
406
|
+
if (requiresEntailment) {
|
|
407
|
+
if (!('sourceEntailed' in answer))
|
|
408
|
+
throw new Error('missing answer source entailment');
|
|
409
|
+
if ((present && answer.sourceEntailed === null) ||
|
|
410
|
+
(!present && answer.sourceEntailed !== null) ||
|
|
411
|
+
(answer.usefulQualifiedAnswer && answer.sourceEntailed !== true))
|
|
412
|
+
throw new Error('inconsistent answer source entailment');
|
|
413
|
+
if (present && answer.sourceEntailed === false)
|
|
414
|
+
unsupportedNonnullAnswers++;
|
|
415
|
+
}
|
|
416
|
+
if (answer.usefulQualifiedAnswer && !observation.expectedHold)
|
|
417
|
+
usefulAnswers++;
|
|
418
|
+
// Answer language does not rerun recall. Count each query/view retrieval once and
|
|
419
|
+
// require consistent judgments when its evidence appears in both answer rows.
|
|
420
|
+
const retrievalKey = `${query.queryLanguage}/${query.explicitView}`;
|
|
421
|
+
if (retrievalJudgments.has(retrievalKey)) {
|
|
422
|
+
if (retrievalJudgments.get(retrievalKey) !== answer.usefulQualifiedRetrieval)
|
|
423
|
+
throw new Error('contradictory judgments for identical retrieval');
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
retrievalJudgments.set(retrievalKey, answer.usefulQualifiedRetrieval);
|
|
427
|
+
if (answer.usefulQualifiedRetrieval && !observation.expectedHold)
|
|
428
|
+
usefulRetrievals++;
|
|
429
|
+
}
|
|
430
|
+
if (answer.justifiedAbstention)
|
|
431
|
+
justifiedAbstentions++;
|
|
432
|
+
if (answer.unsafeFactualPromotion)
|
|
433
|
+
promotions++;
|
|
434
|
+
if (answer.languageCompliant === false)
|
|
435
|
+
languageErrors++;
|
|
436
|
+
if (!answer.qualificationPreserved)
|
|
437
|
+
qualificationErrors++;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const metrics = {
|
|
441
|
+
usefulRetentionCoverage: rate(retained, useful.length),
|
|
442
|
+
qualifiedRetrievalCoverage: rate(usefulRetrievals, useful.length * 4),
|
|
443
|
+
usefulQualifiedAnswerCoverage: rate(usefulAnswers, useful.length * 8),
|
|
444
|
+
justifiedAbstentions,
|
|
445
|
+
expectedSafeHolds: rate(safeHolds, observations.filter((entry) => entry.expectedHold).length),
|
|
446
|
+
unsafeFactualPromotion: promotions,
|
|
447
|
+
acceptedLanguageViolations: languageErrors,
|
|
448
|
+
translationQualificationErrors: qualificationErrors,
|
|
449
|
+
...(requiresEntailment ? { unsupportedRetainedOutputs, unsupportedNonnullAnswers } : {}),
|
|
450
|
+
sourceByteChanges: observations.filter((entry) => entry.bytesStable !== true).length,
|
|
451
|
+
availabilityFailureRate: rate(observations.filter((entry) => entry.availabilityFailure).length, observations.length),
|
|
452
|
+
ordinaryProseFailures: observations.filter((entry) => !entry.ordinaryCorrect).length,
|
|
453
|
+
};
|
|
454
|
+
const prefix = `${report.split}/run-${run}`;
|
|
455
|
+
if (requiresEntailment) {
|
|
456
|
+
if (unsupportedRetainedOutputs > thresholds.unsupportedRetainedOutputs)
|
|
457
|
+
failures.push(`${prefix}:unsupportedRetainedOutputs`);
|
|
458
|
+
if (unsupportedNonnullAnswers > thresholds.unsupportedNonnullAnswers)
|
|
459
|
+
failures.push(`${prefix}:unsupportedNonnullAnswers`);
|
|
460
|
+
}
|
|
461
|
+
for (const key of [
|
|
462
|
+
'usefulRetentionCoverage',
|
|
463
|
+
'qualifiedRetrievalCoverage',
|
|
464
|
+
'usefulQualifiedAnswerCoverage',
|
|
465
|
+
])
|
|
466
|
+
if (metrics[key].rate === null || metrics[key].rate < thresholds[key])
|
|
467
|
+
failures.push(`${prefix}:${key}`);
|
|
468
|
+
for (const key of [
|
|
469
|
+
'unsafeFactualPromotion',
|
|
470
|
+
'acceptedLanguageViolations',
|
|
471
|
+
'translationQualificationErrors',
|
|
472
|
+
'sourceByteChanges',
|
|
473
|
+
])
|
|
474
|
+
if (metrics[key] > thresholds[key])
|
|
475
|
+
failures.push(`${prefix}:${key}`);
|
|
476
|
+
if (metrics.availabilityFailureRate.rate === null ||
|
|
477
|
+
metrics.availabilityFailureRate.rate > thresholds.availabilityFailureRate)
|
|
478
|
+
failures.push(`${prefix}:availability`);
|
|
479
|
+
if (metrics.expectedSafeHolds.denominator && metrics.expectedSafeHolds.rate !== 1)
|
|
480
|
+
failures.push(`${prefix}:admission`);
|
|
481
|
+
if (metrics.ordinaryProseFailures > 0)
|
|
482
|
+
failures.push(`${prefix}:ordinaryProse`);
|
|
483
|
+
return {
|
|
484
|
+
split: report.split,
|
|
485
|
+
run,
|
|
486
|
+
metrics,
|
|
487
|
+
...([
|
|
488
|
+
'language-discourse-v10',
|
|
489
|
+
'language-discourse-v11',
|
|
490
|
+
'language-discourse-v12',
|
|
491
|
+
'language-discourse-v13',
|
|
492
|
+
'language-discourse-v14',
|
|
493
|
+
'language-discourse-v15',
|
|
494
|
+
'language-discourse-v16',
|
|
495
|
+
'language-discourse-v17',
|
|
496
|
+
'language-discourse-v18',
|
|
497
|
+
'language-discourse-v19',
|
|
498
|
+
'language-discourse-v20',
|
|
499
|
+
'language-discourse-v21',
|
|
500
|
+
'language-discourse-v22',
|
|
501
|
+
'language-discourse-v23',
|
|
502
|
+
].includes(report.corpusVersion)
|
|
503
|
+
? { breakdowns: reviewBreakdowns(observations, review) }
|
|
504
|
+
: {}),
|
|
505
|
+
};
|
|
506
|
+
}));
|
|
507
|
+
return {
|
|
508
|
+
schemaVersion: requiresEntailment ? 'language-quality-gate-v2' : 'language-quality-gate-v1',
|
|
509
|
+
independentlyReviewed: true,
|
|
510
|
+
adjudicationKind: review.reviewer.kind,
|
|
511
|
+
reviewer: review.reviewer.id,
|
|
512
|
+
releaseEligible: failures.length === 0,
|
|
513
|
+
scope: review.reviewer.kind === 'model'
|
|
514
|
+
? 'Frozen invented English/Russian corpus; independent model adjudication is fallible and is not human validation or a general reliability guarantee.'
|
|
515
|
+
: 'Independent human adjudication of a frozen invented English/Russian corpus; not a general reliability guarantee.',
|
|
516
|
+
packetFingerprint: packet.packetFingerprint,
|
|
517
|
+
inputReviewFingerprint: packet.inputReviewFingerprint,
|
|
518
|
+
outputReviewFingerprint: sha256(JSON.stringify(review)),
|
|
519
|
+
thresholds,
|
|
520
|
+
failures,
|
|
521
|
+
groups,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
function reviewBreakdowns(observations, review) {
|
|
525
|
+
const cases = observations
|
|
526
|
+
.filter((entry) => !entry.expectedHold)
|
|
527
|
+
.map((entry) => ({
|
|
528
|
+
...entry,
|
|
529
|
+
judgment: review.cases.find((judgment) => judgment.id === entry.id && judgment.run === entry.run),
|
|
530
|
+
}));
|
|
531
|
+
const answers = cases.flatMap((entry) => entry.judgment.answers.map((answer) => ({
|
|
532
|
+
...answer,
|
|
533
|
+
sourceLanguage: entry.language,
|
|
534
|
+
scenario: entry.scenario,
|
|
535
|
+
})));
|
|
536
|
+
const summarizeAnswers = (rows) => ({
|
|
537
|
+
usefulQualifiedAnswerCoverage: rate(rows.filter((row) => row.usefulQualifiedAnswer).length, rows.length),
|
|
538
|
+
justifiedAbstentions: rows.filter((row) => row.justifiedAbstention).length,
|
|
539
|
+
acceptedLanguageViolations: rows.filter((row) => row.languageCompliant === false).length,
|
|
540
|
+
translationQualificationErrors: rows.filter((row) => !row.qualificationPreserved).length,
|
|
541
|
+
unsafeFactualPromotion: rows.filter((row) => row.unsafeFactualPromotion).length,
|
|
542
|
+
});
|
|
543
|
+
const byAnswerDimension = (dimension) => Object.fromEntries(['en', 'ru'].map((key) => [key, summarizeAnswers(answers.filter((row) => row[dimension] === key))]));
|
|
544
|
+
const bySourceDimension = (dimension) => Object.fromEntries([...new Set(cases.map((entry) => entry[dimension]))].map((key) => {
|
|
545
|
+
const selected = cases.filter((entry) => entry[dimension] === key);
|
|
546
|
+
return [
|
|
547
|
+
key,
|
|
548
|
+
{
|
|
549
|
+
usefulRetentionCoverage: rate(selected.filter((entry) => entry.judgment.retentionUseful).length, selected.length),
|
|
550
|
+
...summarizeAnswers(selected.flatMap((entry) => entry.judgment.answers.map((answer) => ({
|
|
551
|
+
...answer,
|
|
552
|
+
sourceLanguage: entry.language,
|
|
553
|
+
scenario: entry.scenario,
|
|
554
|
+
})))),
|
|
555
|
+
},
|
|
556
|
+
];
|
|
557
|
+
}));
|
|
558
|
+
return {
|
|
559
|
+
bySourceLanguage: bySourceDimension('language'),
|
|
560
|
+
byScenario: bySourceDimension('scenario'),
|
|
561
|
+
byQueryLanguage: byAnswerDimension('queryLanguage'),
|
|
562
|
+
byAnswerLanguage: byAnswerDimension('answerLanguage'),
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
function exactIds(actual, expected) {
|
|
566
|
+
if (actual.length !== expected.length ||
|
|
567
|
+
new Set(actual).size !== actual.length ||
|
|
568
|
+
actual.some((id) => !expected.includes(id)))
|
|
569
|
+
throw new Error('incomplete or duplicate review matrix');
|
|
570
|
+
}
|
|
571
|
+
function separateReviewer(reviewer, report) {
|
|
572
|
+
if (reviewer.kind === 'model' &&
|
|
573
|
+
[report.models.answer, report.models.retention].some((id) => id?.split('/').at(-1) === reviewer.id.split('/').at(-1)))
|
|
574
|
+
throw new Error('reviewer must differ from runtime models');
|
|
575
|
+
}
|
|
576
|
+
function matrixKeys() {
|
|
577
|
+
return ['en', 'ru'].flatMap((query) => ['en', 'ru'].flatMap((answer) => [false, true].map((explicit) => `${query}/${answer}/${explicit}`)));
|
|
578
|
+
}
|
|
579
|
+
function queryKey(query) {
|
|
580
|
+
return `${query.queryLanguage}/${query.requestedAnswerLanguage}/${query.explicitView}`;
|
|
581
|
+
}
|
|
582
|
+
function answerKey(answer) {
|
|
583
|
+
return `${answer.queryLanguage}/${answer.answerLanguage}/${answer.explicitView}`;
|
|
584
|
+
}
|
|
585
|
+
function rate(numerator, denominator) {
|
|
586
|
+
return { numerator, denominator, rate: denominator ? numerator / denominator : null };
|
|
587
|
+
}
|
|
588
|
+
function contract(report) {
|
|
589
|
+
return {
|
|
590
|
+
models: report.models,
|
|
591
|
+
...(report.modelConfiguration ? { modelConfiguration: report.modelConfiguration } : {}),
|
|
592
|
+
...(report.retrievalProfile ? { retrievalProfile: report.retrievalProfile } : {}),
|
|
593
|
+
...(report.retrievalConfiguration ? { retrievalConfiguration: report.retrievalConfiguration } : {}),
|
|
594
|
+
...(report.modelOutputTokenLimits ? { modelOutputTokenLimits: report.modelOutputTokenLimits } : {}),
|
|
595
|
+
proseProjectionVersion: report.proseProjectionVersion,
|
|
596
|
+
memoryViewVersion: report.memoryViewVersion,
|
|
597
|
+
answerPromptVersion: report.answerPromptVersion,
|
|
598
|
+
answerVerifierVersion: report.answerVerifierVersion,
|
|
599
|
+
retentionPromptVersion: report.retentionPromptVersion,
|
|
600
|
+
retentionVerifierVersion: report.retentionVerifierVersion,
|
|
601
|
+
knowledgeLanguage: report.knowledgeLanguage,
|
|
602
|
+
setup: report.setup,
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=language-review.js.map
|