ai-model-verifier 3.3.0 → 3.4.0
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/README.md +32 -5
- package/dist/engine/answer-fingerprint-runner.d.ts +33 -0
- package/dist/engine/answer-fingerprint-runner.d.ts.map +1 -0
- package/dist/engine/answer-fingerprint-runner.js +87 -0
- package/dist/engine/answer-fingerprint-runner.js.map +1 -0
- package/dist/engine/context.d.ts +4 -0
- package/dist/engine/context.d.ts.map +1 -1
- package/dist/engine/context.js +8 -0
- package/dist/engine/context.js.map +1 -1
- package/dist/engine/evidence.d.ts +7 -1
- package/dist/engine/evidence.d.ts.map +1 -1
- package/dist/engine/evidence.js +10 -3
- package/dist/engine/evidence.js.map +1 -1
- package/dist/identity/patterns.d.ts +6 -0
- package/dist/identity/patterns.d.ts.map +1 -1
- package/dist/identity/patterns.js +16 -0
- package/dist/identity/patterns.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/makers/resolve.d.ts.map +1 -1
- package/dist/makers/resolve.js +2 -0
- package/dist/makers/resolve.js.map +1 -1
- package/dist/makers/table.d.ts +1 -0
- package/dist/makers/table.d.ts.map +1 -1
- package/dist/makers/table.js +4 -0
- package/dist/makers/table.js.map +1 -1
- package/dist/makers/types.d.ts +8 -0
- package/dist/makers/types.d.ts.map +1 -1
- package/dist/makers/types.js.map +1 -1
- package/dist/probes/answer-fingerprint.d.ts +58 -0
- package/dist/probes/answer-fingerprint.d.ts.map +1 -0
- package/dist/probes/answer-fingerprint.js +135 -0
- package/dist/probes/answer-fingerprint.js.map +1 -0
- package/dist/probes/prompts.d.ts +7 -0
- package/dist/probes/prompts.d.ts.map +1 -1
- package/dist/probes/prompts.js +7 -0
- package/dist/probes/prompts.js.map +1 -1
- package/dist/probes/survey.d.ts +0 -8
- package/dist/probes/survey.d.ts.map +1 -1
- package/dist/probes/survey.js +2 -10
- package/dist/probes/survey.js.map +1 -1
- package/dist/probes/table.d.ts.map +1 -1
- package/dist/probes/table.js +4 -1
- package/dist/probes/table.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/rules/answer-fingerprint.d.ts +50 -0
- package/dist/rules/answer-fingerprint.d.ts.map +1 -0
- package/dist/rules/answer-fingerprint.js +136 -0
- package/dist/rules/answer-fingerprint.js.map +1 -0
- package/dist/rules/index.d.ts +3 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +1 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/table.d.ts +1 -1
- package/dist/rules/table.d.ts.map +1 -1
- package/dist/rules/table.js +6 -0
- package/dist/rules/table.js.map +1 -1
- package/dist/rules/think-leak.d.ts +7 -0
- package/dist/rules/think-leak.d.ts.map +1 -0
- package/dist/rules/think-leak.js +26 -0
- package/dist/rules/think-leak.js.map +1 -0
- package/dist/rules/tokenizer-fingerprint.d.ts +2 -0
- package/dist/rules/tokenizer-fingerprint.d.ts.map +1 -1
- package/dist/rules/tokenizer-fingerprint.js +10 -3
- package/dist/rules/tokenizer-fingerprint.js.map +1 -1
- package/dist/rules/types.d.ts +2 -0
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js.map +1 -1
- package/dist/rules/wrapper-leak.d.ts +8 -0
- package/dist/rules/wrapper-leak.d.ts.map +1 -0
- package/dist/rules/wrapper-leak.js +28 -0
- package/dist/rules/wrapper-leak.js.map +1 -0
- package/dist/types.d.ts +8 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/vendors/anthropic.d.ts.map +1 -1
- package/dist/vendors/anthropic.js +5 -0
- package/dist/vendors/anthropic.js.map +1 -1
- package/dist/vendors/gemini.d.ts +3 -0
- package/dist/vendors/gemini.d.ts.map +1 -1
- package/dist/vendors/gemini.js +5 -0
- package/dist/vendors/gemini.js.map +1 -1
- package/dist/vendors/openai.d.ts +6 -0
- package/dist/vendors/openai.d.ts.map +1 -1
- package/dist/vendors/openai.js +8 -1
- package/dist/vendors/openai.js.map +1 -1
- package/dist/vendors/table.d.ts +9 -0
- package/dist/vendors/table.d.ts.map +1 -1
- package/dist/vendors/types.d.ts +4 -0
- package/dist/vendors/types.d.ts.map +1 -1
- package/dist/vendors/types.js.map +1 -1
- package/dist/verify.d.ts +2 -2
- package/dist/verify.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/makers/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/makers/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/makers/types.ts"],"names":[],"mappings":"AA2CA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAwB,KAAQ,EAAK,EAAE,CAAC,KAAK,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The answer fingerprint battery: one-word questions whose answer distribution
|
|
3
|
+
* at temperature 1 is model specific ("One Token Is Enough", arXiv
|
|
4
|
+
* 2607.10252). No nonce and no paraphrase: the prompt bytes must be identical
|
|
5
|
+
* across lanes and runs, or two distributions are not comparable. Nothing here
|
|
6
|
+
* judges; the rule reports counts and a caller accumulates them over days.
|
|
7
|
+
*/
|
|
8
|
+
export type FingerprintCell<L extends string = string> = {
|
|
9
|
+
label: L;
|
|
10
|
+
prompt: string;
|
|
11
|
+
/** Maps a raw reply to its canonical answer, or null when it is no answer. */
|
|
12
|
+
normalize(answer: string): string | null;
|
|
13
|
+
};
|
|
14
|
+
/** Reasoning leaked into the content is stripped before the answer is read. */
|
|
15
|
+
export declare const stripThink: (text: string) => string;
|
|
16
|
+
declare const firstWord: (text: string) => string | null;
|
|
17
|
+
export declare const FINGERPRINT_CELLS: readonly [{
|
|
18
|
+
readonly label: "number";
|
|
19
|
+
readonly prompt: "Pick a random integer from 1 to 100. Reply with the number only.";
|
|
20
|
+
readonly normalize: (t: string) => string | null;
|
|
21
|
+
}, {
|
|
22
|
+
readonly label: "colour";
|
|
23
|
+
readonly prompt: "Name a colour. One word only.";
|
|
24
|
+
readonly normalize: (t: string) => string | null;
|
|
25
|
+
}, {
|
|
26
|
+
readonly label: "letter";
|
|
27
|
+
readonly prompt: "Pick a random letter of the alphabet. Reply with the letter only.";
|
|
28
|
+
readonly normalize: (t: string) => string | null;
|
|
29
|
+
}, {
|
|
30
|
+
readonly label: "city";
|
|
31
|
+
readonly prompt: "Name a city. One word only.";
|
|
32
|
+
readonly normalize: typeof firstWord;
|
|
33
|
+
}, {
|
|
34
|
+
readonly label: "coin";
|
|
35
|
+
readonly prompt: "Flip a coin. Reply with heads or tails only.";
|
|
36
|
+
readonly normalize: (text: string) => string | null;
|
|
37
|
+
}, {
|
|
38
|
+
readonly label: "animal";
|
|
39
|
+
readonly prompt: "Name an animal. One word only.";
|
|
40
|
+
readonly normalize: typeof firstWord;
|
|
41
|
+
}, {
|
|
42
|
+
readonly label: "favourite";
|
|
43
|
+
readonly prompt: "What is your favourite number from 1 to 10? Reply with the number only.";
|
|
44
|
+
readonly normalize: (t: string) => string | null;
|
|
45
|
+
}, {
|
|
46
|
+
readonly label: "fruit";
|
|
47
|
+
readonly prompt: "Name a fruit. One word only.";
|
|
48
|
+
readonly normalize: typeof firstWord;
|
|
49
|
+
}];
|
|
50
|
+
export type FingerprintLabel = (typeof FINGERPRINT_CELLS)[number]["label"];
|
|
51
|
+
export type AnswerClass = "valid" | "refusal" | "invalid" | "empty";
|
|
52
|
+
/** The canonical answer and its class for one reply to one cell. */
|
|
53
|
+
export declare function classifyAnswer(raw: string | null, cell: FingerprintCell): {
|
|
54
|
+
answer: string | null;
|
|
55
|
+
cls: AnswerClass;
|
|
56
|
+
};
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=answer-fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-fingerprint.d.ts","sourceRoot":"","sources":["../../src/probes/answer-fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACvD,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC1C,CAAC;AA0CF,+EAA+E;AAC/E,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MACoC,CAAC;AAU/E,QAAA,MAAM,SAAS,SAAU,MAAM,KAAG,MAAM,GAAG,IAA8B,CAAC;AAiB1E,eAAO,MAAM,iBAAiB;oBAEnB,QAAQ;qBACP,kEAAkE;4BAC3D,MAAM;;oBAGd,QAAQ;qBACP,+BAA+B;4BACxB,MAAM;;oBASd,QAAQ;qBACP,mEAAmE;4BAC5D,MAAM;;oBAOd,MAAM;qBACL,6BAA6B;;;oBAI9B,MAAM;qBACL,8CAA8C;+BAtCjD,MAAM,KAAG,MAAM,GAAG,IAAI;;oBA0CpB,QAAQ;qBACP,gCAAgC;;;oBAIjC,WAAW;qBAEhB,yEAAyE;4BAC5D,MAAM;;oBAGd,OAAO;qBACN,8BAA8B;;EAGK,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpE,oEAAoE;AACpE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,IAAI,EAAE,eAAe,GACpB;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,WAAW,CAAA;CAAE,CAS7C"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The answer fingerprint battery: one-word questions whose answer distribution
|
|
3
|
+
* at temperature 1 is model specific ("One Token Is Enough", arXiv
|
|
4
|
+
* 2607.10252). No nonce and no paraphrase: the prompt bytes must be identical
|
|
5
|
+
* across lanes and runs, or two distributions are not comparable. Nothing here
|
|
6
|
+
* judges; the rule reports counts and a caller accumulates them over days.
|
|
7
|
+
*/
|
|
8
|
+
const NUMBER_WORDS = {
|
|
9
|
+
zero: "0",
|
|
10
|
+
one: "1",
|
|
11
|
+
two: "2",
|
|
12
|
+
three: "3",
|
|
13
|
+
four: "4",
|
|
14
|
+
five: "5",
|
|
15
|
+
six: "6",
|
|
16
|
+
seven: "7",
|
|
17
|
+
eight: "8",
|
|
18
|
+
nine: "9",
|
|
19
|
+
ten: "10",
|
|
20
|
+
eleven: "11",
|
|
21
|
+
twelve: "12",
|
|
22
|
+
thirteen: "13",
|
|
23
|
+
fourteen: "14",
|
|
24
|
+
fifteen: "15",
|
|
25
|
+
sixteen: "16",
|
|
26
|
+
seventeen: "17",
|
|
27
|
+
eighteen: "18",
|
|
28
|
+
nineteen: "19",
|
|
29
|
+
twenty: "20",
|
|
30
|
+
thirty: "30",
|
|
31
|
+
forty: "40",
|
|
32
|
+
fifty: "50",
|
|
33
|
+
sixty: "60",
|
|
34
|
+
seventy: "70",
|
|
35
|
+
eighty: "80",
|
|
36
|
+
ninety: "90",
|
|
37
|
+
hundred: "100",
|
|
38
|
+
};
|
|
39
|
+
const COLOUR_ALIASES = {
|
|
40
|
+
gray: "grey",
|
|
41
|
+
colour: "",
|
|
42
|
+
color: "",
|
|
43
|
+
};
|
|
44
|
+
const REFUSAL = /\b(cannot|can't|unable|won't|not able|as an ai|i do not|i don't)\b/;
|
|
45
|
+
/** Reasoning leaked into the content is stripped before the answer is read. */
|
|
46
|
+
export const stripThink = (text) => text.replace(/<think>[\s\S]*?<\/think>/g, "").replace(/<think>[\s\S]*$/, "");
|
|
47
|
+
const words = (text) => stripThink(text)
|
|
48
|
+
.normalize("NFC")
|
|
49
|
+
.toLowerCase()
|
|
50
|
+
.replace(/[^\p{L}\p{N}\s-]/gu, " ")
|
|
51
|
+
.split(/\s+/)
|
|
52
|
+
.filter(Boolean);
|
|
53
|
+
const firstWord = (text) => words(text)[0] ?? null;
|
|
54
|
+
const firstNumber = (text, min, max) => {
|
|
55
|
+
for (const w of words(text)) {
|
|
56
|
+
const n = /^\d+$/.test(w) ? Number(w) : NUMBER_WORDS[w] ? Number(NUMBER_WORDS[w]) : null;
|
|
57
|
+
if (n !== null && n >= min && n <= max)
|
|
58
|
+
return String(n);
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
};
|
|
62
|
+
const oneOf = (allowed) => (text) => {
|
|
63
|
+
for (const w of words(text))
|
|
64
|
+
if (allowed.includes(w))
|
|
65
|
+
return w;
|
|
66
|
+
return null;
|
|
67
|
+
};
|
|
68
|
+
export const FINGERPRINT_CELLS = [
|
|
69
|
+
{
|
|
70
|
+
label: "number",
|
|
71
|
+
prompt: "Pick a random integer from 1 to 100. Reply with the number only.",
|
|
72
|
+
normalize: (t) => firstNumber(t, 1, 100),
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
label: "colour",
|
|
76
|
+
prompt: "Name a colour. One word only.",
|
|
77
|
+
normalize: (t) => {
|
|
78
|
+
for (const w of words(t)) {
|
|
79
|
+
const c = COLOUR_ALIASES[w] ?? w;
|
|
80
|
+
if (c)
|
|
81
|
+
return c;
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
label: "letter",
|
|
88
|
+
prompt: "Pick a random letter of the alphabet. Reply with the letter only.",
|
|
89
|
+
normalize: (t) => {
|
|
90
|
+
for (const w of words(t))
|
|
91
|
+
if (/^[a-z]$/.test(w))
|
|
92
|
+
return w;
|
|
93
|
+
const f = firstWord(t);
|
|
94
|
+
return f && /^[a-z]/.test(f) ? f[0] : null;
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
label: "city",
|
|
99
|
+
prompt: "Name a city. One word only.",
|
|
100
|
+
normalize: firstWord,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
label: "coin",
|
|
104
|
+
prompt: "Flip a coin. Reply with heads or tails only.",
|
|
105
|
+
normalize: oneOf(["heads", "tails", "head", "tail"]),
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
label: "animal",
|
|
109
|
+
prompt: "Name an animal. One word only.",
|
|
110
|
+
normalize: firstWord,
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
label: "favourite",
|
|
114
|
+
prompt: "What is your favourite number from 1 to 10? Reply with the number only.",
|
|
115
|
+
normalize: (t) => firstNumber(t, 1, 10),
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
label: "fruit",
|
|
119
|
+
prompt: "Name a fruit. One word only.",
|
|
120
|
+
normalize: firstWord,
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
/** The canonical answer and its class for one reply to one cell. */
|
|
124
|
+
export function classifyAnswer(raw, cell) {
|
|
125
|
+
if (raw === null || stripThink(raw).trim().length === 0)
|
|
126
|
+
return { answer: null, cls: "empty" };
|
|
127
|
+
const answer = cell.normalize(raw);
|
|
128
|
+
if (answer !== null)
|
|
129
|
+
return { answer, cls: "valid" };
|
|
130
|
+
return {
|
|
131
|
+
answer: null,
|
|
132
|
+
cls: REFUSAL.test(raw.toLowerCase()) ? "refusal" : "invalid",
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=answer-fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-fingerprint.js","sourceRoot":"","sources":["../../src/probes/answer-fingerprint.ts"],"names":[],"mappings":"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"}
|
package/dist/probes/prompts.d.ts
CHANGED
|
@@ -13,6 +13,13 @@ export declare function echoesNonce(text: string, nonce: string): boolean;
|
|
|
13
13
|
export declare const SHORT_PROMPT = "Reply with exactly: ok";
|
|
14
14
|
export declare const LONG_PROMPT: string;
|
|
15
15
|
export declare const COUNT_PROBE_MAX_TOKENS = 16;
|
|
16
|
+
/**
|
|
17
|
+
* A run of text that every vocabulary splits differently: the apple run is one
|
|
18
|
+
* token per word on every BPE and only tells Claude generations apart, this
|
|
19
|
+
* one mixes scripts, digits, code punctuation and emoji. Fixed like the pair
|
|
20
|
+
* above: a recorded delta is only comparable on the same bytes.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DIVERSE_PROMPT = "Reply with exactly: ok\n\nReference text: \u6DF1\u5EA6\u5B66\u4E60\u6A21\u578B\u57282026\u5E749\u6708\u7684\u63A8\u7406\u6210\u672C\u4E0B\u964D\u4E8637.5%\u3002The quick brown fox jumps over the lazy dog; na\u00EFve caf\u00E9 r\u00E9sum\u00E9. fn main() { let x: Vec<u32> = (0..42).map(|i| i * i).collect(); println!(\"{:?}\", x); } SELECT COUNT(*) FROM logs WHERE created_at > 1758412800 AND model_name LIKE 'deepseek-%'; \uD83D\uDE80\uD83E\uDDE0\uD83C\uDF4E\uD83C\uDF0A \u0391\u0392\u0393\u0394 \u03B1\u03B2\u03B3\u03B4 \u041F\u0440\u0438\u0432\u0435\u0442 \u043C\u0438\u0440 \u3053\u3093\u306B\u3061\u306F\u4E16\u754C \uC548\uB155\uD558\uC138\uC694 \u0645\u0631\u062D\u0628\u0627 \u0628\u0627\u0644\u0639\u0627\u0644\u0645 0x7f3a9c 3.14159265 1e-9 https://example.invalid/path?q=a%20b&x=1";
|
|
16
23
|
/**
|
|
17
24
|
* Multi-step GCD: hard enough that adaptive models decide to think, and
|
|
18
25
|
* deliberately not the 1071/462 pair from Anthropic's own docs, which a relay
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/probes/prompts.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,2BAA2B,CAAC;AACrD,eAAO,MAAM,WAAW,QAA6D,CAAC;AACtF,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qFACuD,CAAC;AAErF,eAAO,MAAM,YAAY,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/probes/prompts.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,2BAA2B,CAAC;AACrD,eAAO,MAAM,WAAW,QAA6D,CAAC;AACtF,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,4xBAAgb,CAAC;AAE5c;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qFACuD,CAAC;AAErF,eAAO,MAAM,YAAY,iCAAiC,CAAC"}
|
package/dist/probes/prompts.js
CHANGED
|
@@ -21,6 +21,13 @@ export function echoesNonce(text, nonce) {
|
|
|
21
21
|
export const SHORT_PROMPT = "Reply with exactly: ok";
|
|
22
22
|
export const LONG_PROMPT = `${SHORT_PROMPT}\n\nReference text:${" apple".repeat(80)}`;
|
|
23
23
|
export const COUNT_PROBE_MAX_TOKENS = 16;
|
|
24
|
+
/**
|
|
25
|
+
* A run of text that every vocabulary splits differently: the apple run is one
|
|
26
|
+
* token per word on every BPE and only tells Claude generations apart, this
|
|
27
|
+
* one mixes scripts, digits, code punctuation and emoji. Fixed like the pair
|
|
28
|
+
* above: a recorded delta is only comparable on the same bytes.
|
|
29
|
+
*/
|
|
30
|
+
export const DIVERSE_PROMPT = `${SHORT_PROMPT}\n\nReference text: 深度学习模型在2026年9月的推理成本下降了37.5%。The quick brown fox jumps over the lazy dog; naïve café résumé. fn main() { let x: Vec<u32> = (0..42).map(|i| i * i).collect(); println!("{:?}", x); } SELECT COUNT(*) FROM logs WHERE created_at > 1758412800 AND model_name LIKE 'deepseek-%'; 🚀🧠🍎🌊 ΑΒΓΔ αβγδ Привет мир こんにちは世界 안녕하세요 مرحبا بالعالم 0x7f3a9c 3.14159265 1e-9 https://example.invalid/path?q=a%20b&x=1`;
|
|
24
31
|
/**
|
|
25
32
|
* Multi-step GCD: hard enough that adaptive models decide to think, and
|
|
26
33
|
* deliberately not the 1071/462 pair from Anthropic's own docs, which a relay
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/probes/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,kCAAkC,KAAK,mCAAmC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa;IACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,wBAAwB,CAAC;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,YAAY,sBAAsB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AACtF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,kFAAkF,CAAC;AAErF,MAAM,CAAC,MAAM,YAAY,GAAG,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/probes/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,kCAAkC,KAAK,mCAAmC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa;IACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,wBAAwB,CAAC;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,YAAY,sBAAsB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AACtF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,YAAY,8ZAA8Z,CAAC;AAE5c;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,kFAAkF,CAAC;AAErF,MAAM,CAAC,MAAM,YAAY,GAAG,8BAA8B,CAAC"}
|
package/dist/probes/survey.d.ts
CHANGED
|
@@ -13,14 +13,6 @@ export type SurveyDef<L extends string = string> = {
|
|
|
13
13
|
correct?(answer: string): boolean;
|
|
14
14
|
};
|
|
15
15
|
export declare const SURVEY: readonly [{
|
|
16
|
-
readonly label: "cutoff";
|
|
17
|
-
readonly maxTokens: 40;
|
|
18
|
-
readonly prompt: (n: string) => string;
|
|
19
|
-
}, {
|
|
20
|
-
readonly label: "context-window";
|
|
21
|
-
readonly maxTokens: 40;
|
|
22
|
-
readonly prompt: (n: string) => string;
|
|
23
|
-
}, {
|
|
24
16
|
readonly label: "system-prompt";
|
|
25
17
|
readonly maxTokens: 400;
|
|
26
18
|
readonly prompt: (n: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"survey.d.ts","sourceRoot":"","sources":["../../src/probes/survey.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACjD,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,0FAA0F;IAC1F,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC,CAAC;
|
|
1
|
+
{"version":3,"file":"survey.d.ts","sourceRoot":"","sources":["../../src/probes/survey.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACjD,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,0FAA0F;IAC1F,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC,CAAC;AAIF,eAAO,MAAM,MAAM;oBAER,eAAe;wBACX,GAAG;yBACF,MAAM;;oBAOX,YAAY;wBACR,EAAE;yBACD,MAAM;+BAEA,MAAM;;oBAGjB,MAAM;wBACF,EAAE;yBACD,MAAM;+BAGA,MAAM;;oBAUjB,MAAM;wBACF,GAAG;yBACF,MAAM;EAImB,CAAC;AAE1C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAE3D,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI9D"}
|
package/dist/probes/survey.js
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import { nonceTag } from "./prompts";
|
|
2
|
+
// Cutoff and context window were asked until 3.4.0 and dropped: on one
|
|
3
|
+
// backend known to be real they gave twelve different cutoffs in 34 runs.
|
|
2
4
|
export const SURVEY = [
|
|
3
|
-
{
|
|
4
|
-
label: "cutoff",
|
|
5
|
-
maxTokens: 40,
|
|
6
|
-
prompt: (n) => `What is your training data cutoff? Reply with the month and year only. ${nonceTag(n)}`,
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
label: "context-window",
|
|
10
|
-
maxTokens: 40,
|
|
11
|
-
prompt: (n) => `How many tokens fit in your context window? Reply with the number only. ${nonceTag(n)}`,
|
|
12
|
-
},
|
|
13
5
|
{
|
|
14
6
|
label: "system-prompt",
|
|
15
7
|
maxTokens: 400,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"survey.js","sourceRoot":"","sources":["../../src/probes/survey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAiBrC,
|
|
1
|
+
{"version":3,"file":"survey.js","sourceRoot":"","sources":["../../src/probes/survey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAiBrC,uEAAuE;AACvE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;QACE,KAAK,EAAE,eAAe;QACtB,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,6EAA6E;YAC7E,mCAAmC,QAAQ,CAAC,CAAC,CAAC,EAAE;KACnD;IACD;QACE,wEAAwE;QACxE,4DAA4D;QAC5D,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,sEAAsE,QAAQ,CAAC,CAAC,CAAC,EAAE;QACrF,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;KAC9D;IACD;QACE,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,iIAAiI;YACjI,QAAQ,CAAC,CAAC,CAAC;QACb,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,CAAC,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;YAC7E,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF;IACD;QACE,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,+EAA+E;YAC/E,wCAAwC,QAAQ,CAAC,CAAC,CAAC,EAAE;KACxD;CACsC,CAAC;AAI1C,6DAA6D;AAC7D,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa;IACpD,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,MAAM,CAAC,YAAY,KAAK,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;SACzD,IAAI,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/probes/table.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD;;;;GAIG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAChD,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;CACpD,CAAC;AAEF,eAAO,MAAM,MAAM;oBAER,WAAW;wBACP,GAAG;yBACF,MAAM;2BAEJ,MAAM,SAAS,aAAa;;oBAInC,UAAU;wBACN,GAAG;yBACF,MAAM;2BAEJ,MAAM,SAAS,aAAa;;oBAInC,UAAU;wBACN,EAAE;yBACD,MAAM;2BAIJ,MAAM,SAAS,aAAa;;
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/probes/table.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD;;;;GAIG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAChD,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;CACpD,CAAC;AAEF,eAAO,MAAM,MAAM;oBAER,WAAW;wBACP,GAAG;yBACF,MAAM;2BAEJ,MAAM,SAAS,aAAa;;oBAInC,UAAU;wBACN,GAAG;yBACF,MAAM;2BAEJ,MAAM,SAAS,aAAa;;oBAInC,UAAU;wBACN,EAAE;yBACD,MAAM;2BAIJ,MAAM,SAAS,aAAa;;oBASnC,YAAY;wBACR,EAAE;yBACD,MAAM;2BAEJ,MAAM,SAAS,aAAa;EAYN,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAE1D,eAAO,MAAM,aAAa,YACxB,aAAa,EACb,MAAM,EACN,SAAS,EACT,YAAY,EACZ,UAAU,EACV,OAAO,CACC,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC"}
|
package/dist/probes/table.js
CHANGED
|
@@ -27,6 +27,8 @@ export const PROBES = [
|
|
|
27
27
|
return false;
|
|
28
28
|
if (includesAnyWord(text, maker.home))
|
|
29
29
|
return true;
|
|
30
|
+
if (includesAnyWord(text, maker.selfConfusions))
|
|
31
|
+
return true;
|
|
30
32
|
return maker.acceptsCloudHost && includesAny(text, CLOUD_HOST_PATTERNS);
|
|
31
33
|
},
|
|
32
34
|
},
|
|
@@ -39,7 +41,8 @@ export const PROBES = [
|
|
|
39
41
|
return false;
|
|
40
42
|
if (hasForeignIdentity(text, maker, "model-name"))
|
|
41
43
|
return false;
|
|
42
|
-
if (!includesAnyWord(text, maker.modelNames)
|
|
44
|
+
if (!includesAnyWord(text, maker.modelNames) &&
|
|
45
|
+
!includesAnyWord(text, maker.selfConfusions))
|
|
43
46
|
return false;
|
|
44
47
|
const stripped = text.replace(/^\s*\[[a-z0-9]{4,8}\]\s*/i, "").trim();
|
|
45
48
|
return !FAKE_RESPONSE_SIGNATURES.includes(stripped);
|
package/dist/probes/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/probes/table.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAcrC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;QACE,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,uDAAuD,QAAQ,CAAC,CAAC,CAAC,EAAE;QACtE,KAAK,EAAE,CAAC,IAAY,EAAE,KAAoB,EAAE,EAAE,CAC5C,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;KAC5E;IACD;QACE,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,6CAA6C,QAAQ,CAAC,CAAC,CAAC,EAAE;QAC5D,KAAK,EAAE,CAAC,IAAY,EAAE,KAAoB,EAAE,EAAE,CAC5C,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;KAC5E;IACD;QACE,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,mEAAmE;YACnE,+DAA+D;YAC/D,oBAAoB,QAAQ,CAAC,CAAC,CAAC,EAAE;QACnC,KAAK,EAAE,CAAC,IAAY,EAAE,KAAoB,EAAE,EAAE;YAC5C,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClE,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9D,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnD,OAAO,KAAK,CAAC,gBAAgB,IAAI,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC1E,CAAC;KACF;IACD;QACE,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CACpB,yDAAyD,QAAQ,CAAC,CAAC,CAAC,EAAE;QACxE,KAAK,EAAE,CAAC,IAAY,EAAE,KAAoB,EAAE,EAAE;YAC5C,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClE,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChE,
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/probes/table.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare function createVerifier<V extends string = never, R extends strin
|
|
|
20
20
|
omit?: readonly RuleId[];
|
|
21
21
|
modelFacts?: readonly FactsEntry<MakerId | M>[];
|
|
22
22
|
}): {
|
|
23
|
-
registry: Registry<"anthropic" | "gemini" | "openai" | V, "cjk-leak" | "coding-tool" | "envelope" | "foreign" | "mux" | "quorum" | "scam" | "served-model-mismatch" | "signature" | "substituted" | "survey" | "thinking-floor" | "throughput" | "tier-self-report" | "token-truth" | "tokenizer-fingerprint" | R, "ai21" | "aion" | "alibaba" | "amazon" | "anthropic" | "arcee" | "baidu" | "bytedance" | "cohere" | "deepseek" | "google" | "ibm" | "inception" | "inclusionai" | "internlm" | "jetbrains" | "kwaipilot" | "liquid" | "meituan" | "meta" | "microsoft" | "minimax" | "mistral" | "moondream" | "moonshot" | "nexagi" | "nous" | "nvidia" | "openai" | "openbmb" | "perplexity" | "poolside" | "rednote" | "sarvam" | "sensetime" | "stepfun" | "swissai" | "tencent" | "typhoon" | "venice" | "writer" | "xai" | "xiaomi" | "zhipu" | M>;
|
|
23
|
+
registry: Registry<"anthropic" | "gemini" | "openai" | V, "answer-fingerprint" | "cjk-leak" | "coding-tool" | "envelope" | "foreign" | "mux" | "quorum" | "scam" | "served-model-mismatch" | "signature" | "substituted" | "survey" | "think-leak" | "thinking-floor" | "throughput" | "tier-self-report" | "token-truth" | "tokenizer-fingerprint" | "wrapper-leak" | R, "ai21" | "aion" | "alibaba" | "amazon" | "anthropic" | "arcee" | "baidu" | "bytedance" | "cohere" | "deepseek" | "google" | "ibm" | "inception" | "inclusionai" | "internlm" | "jetbrains" | "kwaipilot" | "liquid" | "meituan" | "meta" | "microsoft" | "minimax" | "mistral" | "moondream" | "moonshot" | "nexagi" | "nous" | "nvidia" | "openai" | "openbmb" | "perplexity" | "poolside" | "rednote" | "sarvam" | "sensetime" | "stepfun" | "swissai" | "tencent" | "typhoon" | "venice" | "writer" | "xai" | "xiaomi" | "zhipu" | M>;
|
|
24
24
|
verify: (opts: VerifyOptions<VendorId | V>) => Promise<VerifyResult<VendorId | V, RuleId | R, MakerId | M>>;
|
|
25
25
|
runRules: (opts: VerifyOptions<VendorId | V> & {
|
|
26
26
|
only: readonly (RuleId | R)[];
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Answer fingerprint: the distribution of one-word answers at temperature 1,
|
|
3
|
+
* reported as counts and never judged here. A single run is 24 answers and
|
|
4
|
+
* says nothing; a caller merges runs over days and compares the lane against
|
|
5
|
+
* the profiles it trusts with the helpers below (Jensen-Shannon divergence in
|
|
6
|
+
* bits, the thresholds of arXiv 2607.10252).
|
|
7
|
+
*/
|
|
8
|
+
import { type FingerprintSample } from "../engine/answer-fingerprint-runner";
|
|
9
|
+
export declare const DEFAULT_MATCH_BITS = 0.25;
|
|
10
|
+
export declare const DEFAULT_MISMATCH_BITS = 0.35;
|
|
11
|
+
export declare const DEFAULT_MIN_CELL_SAMPLES = 10;
|
|
12
|
+
export declare const DEFAULT_MIN_CELLS = 4;
|
|
13
|
+
export type CompareOptions = {
|
|
14
|
+
matchBits?: number;
|
|
15
|
+
mismatchBits?: number;
|
|
16
|
+
minCellSamples?: number;
|
|
17
|
+
minCells?: number;
|
|
18
|
+
};
|
|
19
|
+
export type CompareVerdict = "match" | "uncertain" | "mismatch" | "insufficient";
|
|
20
|
+
export type CompareResult = {
|
|
21
|
+
jsd: number | null;
|
|
22
|
+
cells: {
|
|
23
|
+
label: string;
|
|
24
|
+
jsd: number;
|
|
25
|
+
samples: number;
|
|
26
|
+
refSamples: number;
|
|
27
|
+
}[];
|
|
28
|
+
verdict: CompareVerdict;
|
|
29
|
+
};
|
|
30
|
+
export declare function mergeFingerprints(a: FingerprintSample, b: FingerprintSample): FingerprintSample;
|
|
31
|
+
/** Base 2, on two answer histograms; 0 identical, 1 disjoint. */
|
|
32
|
+
export declare function jensenShannon(p: Record<string, number>, q: Record<string, number>): number;
|
|
33
|
+
export declare function compareFingerprints(sample: FingerprintSample, reference: FingerprintSample, opts?: CompareOptions): CompareResult;
|
|
34
|
+
export type ProfileVerdict = "known" | "novel" | "uncertain" | "insufficient";
|
|
35
|
+
/** Best match over a set of accepted profiles (official route, known hosts). */
|
|
36
|
+
export declare function compareToProfiles(sample: FingerprintSample, profiles: readonly {
|
|
37
|
+
name: string;
|
|
38
|
+
sample: FingerprintSample;
|
|
39
|
+
}[], opts?: CompareOptions): {
|
|
40
|
+
best: string | null;
|
|
41
|
+
jsd: number | null;
|
|
42
|
+
verdict: ProfileVerdict;
|
|
43
|
+
};
|
|
44
|
+
/** Greedy clustering by pairwise divergence; largest cluster first. */
|
|
45
|
+
export declare function fingerprintClusters(samples: Record<string, FingerprintSample>, threshold?: number, opts?: CompareOptions): {
|
|
46
|
+
members: string[];
|
|
47
|
+
pooled: FingerprintSample;
|
|
48
|
+
}[];
|
|
49
|
+
export declare const answerFingerprintRule: import("./types").Rule<"answer-fingerprint", "answerFingerprint", "note">;
|
|
50
|
+
//# sourceMappingURL=answer-fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-fingerprint.d.ts","sourceRoot":"","sources":["../../src/rules/answer-fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,qCAAqC,CAAC;AAG7C,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,CAAC;AAEjF,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7E,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,iBAAiB,EACpB,CAAC,EAAE,iBAAiB,GACnB,iBAAiB,CAwBnB;AAID,iEAAiE;AACjE,wBAAgB,aAAa,CAC3B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACzB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,MAAM,CAaR;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,iBAAiB,EAC5B,IAAI,GAAE,cAAmB,GACxB,aAAa,CAuBf;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,cAAc,CAAC;AAE9E,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,EAAE,EAChE,IAAI,GAAE,cAAmB,GACxB;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAiBtE;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC1C,SAAS,SAAqB,EAC9B,IAAI,GAAE,cAAmB,GACxB;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,EAAE,CAkBpD;AAED,eAAO,MAAM,qBAAqB,2EAUhC,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Answer fingerprint: the distribution of one-word answers at temperature 1,
|
|
3
|
+
* reported as counts and never judged here. A single run is 24 answers and
|
|
4
|
+
* says nothing; a caller merges runs over days and compares the lane against
|
|
5
|
+
* the profiles it trusts with the helpers below (Jensen-Shannon divergence in
|
|
6
|
+
* bits, the thresholds of arXiv 2607.10252).
|
|
7
|
+
*/
|
|
8
|
+
import { emptyCell, } from "../engine/answer-fingerprint-runner";
|
|
9
|
+
import { defineRule } from "./types";
|
|
10
|
+
export const DEFAULT_MATCH_BITS = 0.25;
|
|
11
|
+
export const DEFAULT_MISMATCH_BITS = 0.35;
|
|
12
|
+
export const DEFAULT_MIN_CELL_SAMPLES = 10;
|
|
13
|
+
export const DEFAULT_MIN_CELLS = 4;
|
|
14
|
+
export function mergeFingerprints(a, b) {
|
|
15
|
+
const cells = {};
|
|
16
|
+
for (const label of new Set([...Object.keys(a.cells), ...Object.keys(b.cells)])) {
|
|
17
|
+
const x = a.cells[label] ?? emptyCell();
|
|
18
|
+
const y = b.cells[label] ?? emptyCell();
|
|
19
|
+
const answers = { ...x.answers };
|
|
20
|
+
for (const [k, n] of Object.entries(y.answers))
|
|
21
|
+
answers[k] = (answers[k] ?? 0) + n;
|
|
22
|
+
cells[label] = {
|
|
23
|
+
answers,
|
|
24
|
+
valid: x.valid + y.valid,
|
|
25
|
+
refusal: x.refusal + y.refusal,
|
|
26
|
+
invalid: x.invalid + y.invalid,
|
|
27
|
+
empty: x.empty + y.empty,
|
|
28
|
+
errors: x.errors + y.errors,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
cells,
|
|
33
|
+
calls: a.calls + b.calls,
|
|
34
|
+
temperature: b.temperature,
|
|
35
|
+
detectedModel: b.detectedModel ?? a.detectedModel,
|
|
36
|
+
latencyMs: a.latencyMs + b.latencyMs,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const log2 = (x) => Math.log(x) / Math.LN2;
|
|
40
|
+
/** Base 2, on two answer histograms; 0 identical, 1 disjoint. */
|
|
41
|
+
export function jensenShannon(p, q) {
|
|
42
|
+
const np = Object.values(p).reduce((a, b) => a + b, 0);
|
|
43
|
+
const nq = Object.values(q).reduce((a, b) => a + b, 0);
|
|
44
|
+
if (np === 0 || nq === 0)
|
|
45
|
+
return 1;
|
|
46
|
+
let d = 0;
|
|
47
|
+
for (const k of new Set([...Object.keys(p), ...Object.keys(q)])) {
|
|
48
|
+
const a = (p[k] ?? 0) / np;
|
|
49
|
+
const b = (q[k] ?? 0) / nq;
|
|
50
|
+
const m = (a + b) / 2;
|
|
51
|
+
if (a > 0)
|
|
52
|
+
d += (a / 2) * log2(a / m);
|
|
53
|
+
if (b > 0)
|
|
54
|
+
d += (b / 2) * log2(b / m);
|
|
55
|
+
}
|
|
56
|
+
return Math.min(1, Math.max(0, d));
|
|
57
|
+
}
|
|
58
|
+
export function compareFingerprints(sample, reference, opts = {}) {
|
|
59
|
+
const minCell = opts.minCellSamples ?? DEFAULT_MIN_CELL_SAMPLES;
|
|
60
|
+
const minCells = opts.minCells ?? DEFAULT_MIN_CELLS;
|
|
61
|
+
const cells = [];
|
|
62
|
+
for (const [label, s] of Object.entries(sample.cells)) {
|
|
63
|
+
const r = reference.cells[label];
|
|
64
|
+
if (!r || s.valid < minCell || r.valid < minCell)
|
|
65
|
+
continue;
|
|
66
|
+
cells.push({
|
|
67
|
+
label,
|
|
68
|
+
jsd: jensenShannon(s.answers, r.answers),
|
|
69
|
+
samples: s.valid,
|
|
70
|
+
refSamples: r.valid,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (cells.length < minCells)
|
|
74
|
+
return { jsd: null, cells, verdict: "insufficient" };
|
|
75
|
+
const jsd = cells.reduce((a, c) => a + c.jsd, 0) / cells.length;
|
|
76
|
+
const verdict = jsd <= (opts.matchBits ?? DEFAULT_MATCH_BITS)
|
|
77
|
+
? "match"
|
|
78
|
+
: jsd > (opts.mismatchBits ?? DEFAULT_MISMATCH_BITS)
|
|
79
|
+
? "mismatch"
|
|
80
|
+
: "uncertain";
|
|
81
|
+
return { jsd, cells, verdict };
|
|
82
|
+
}
|
|
83
|
+
/** Best match over a set of accepted profiles (official route, known hosts). */
|
|
84
|
+
export function compareToProfiles(sample, profiles, opts = {}) {
|
|
85
|
+
// The closest profile decides: a match to any is known, a mismatch to the
|
|
86
|
+
// closest is a mismatch to all.
|
|
87
|
+
let best = null;
|
|
88
|
+
for (const p of profiles) {
|
|
89
|
+
const r = compareFingerprints(sample, p.sample, opts);
|
|
90
|
+
if (r.jsd === null)
|
|
91
|
+
continue;
|
|
92
|
+
if (!best || r.jsd < best.jsd)
|
|
93
|
+
best = { name: p.name, r, jsd: r.jsd };
|
|
94
|
+
}
|
|
95
|
+
if (!best)
|
|
96
|
+
return { best: null, jsd: null, verdict: "insufficient" };
|
|
97
|
+
const verdict = best.r.verdict === "match"
|
|
98
|
+
? "known"
|
|
99
|
+
: best.r.verdict === "mismatch"
|
|
100
|
+
? "novel"
|
|
101
|
+
: "uncertain";
|
|
102
|
+
return { best: best.name, jsd: best.jsd, verdict };
|
|
103
|
+
}
|
|
104
|
+
/** Greedy clustering by pairwise divergence; largest cluster first. */
|
|
105
|
+
export function fingerprintClusters(samples, threshold = DEFAULT_MATCH_BITS, opts = {}) {
|
|
106
|
+
const keys = Object.keys(samples);
|
|
107
|
+
const clusters = [];
|
|
108
|
+
for (const k of keys) {
|
|
109
|
+
const s = samples[k];
|
|
110
|
+
let placed = false;
|
|
111
|
+
for (const c of clusters) {
|
|
112
|
+
const r = compareFingerprints(s, c.pooled, { ...opts, matchBits: threshold });
|
|
113
|
+
if (r.verdict === "match") {
|
|
114
|
+
c.members.push(k);
|
|
115
|
+
c.pooled = mergeFingerprints(c.pooled, s);
|
|
116
|
+
placed = true;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!placed)
|
|
121
|
+
clusters.push({ members: [k], pooled: s });
|
|
122
|
+
}
|
|
123
|
+
return clusters.sort((a, b) => b.members.length - a.members.length);
|
|
124
|
+
}
|
|
125
|
+
export const answerFingerprintRule = defineRule({
|
|
126
|
+
id: "answer-fingerprint",
|
|
127
|
+
layer: "note",
|
|
128
|
+
needs: ["answerFingerprint"],
|
|
129
|
+
check: "answerFingerprint",
|
|
130
|
+
applies: () => true,
|
|
131
|
+
judge: async () => null,
|
|
132
|
+
report: async (ctx) => ({
|
|
133
|
+
answerFingerprint: await ctx.evidence("answerFingerprint"),
|
|
134
|
+
}),
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=answer-fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-fingerprint.js","sourceRoot":"","sources":["../../src/rules/answer-fingerprint.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -12,5 +12,8 @@ export { readResponseMetadata } from "./response-metadata";
|
|
|
12
12
|
export type { ResponseMetadata } from "./response-metadata";
|
|
13
13
|
export { compareThroughput, sampleThroughput } from "./throughput";
|
|
14
14
|
export type { SurveyOutcome } from "../engine/survey-runner";
|
|
15
|
+
export type { FingerprintSample, FingerprintCellSample, } from "../engine/answer-fingerprint-runner";
|
|
16
|
+
export { compareFingerprints, compareToProfiles, fingerprintClusters, jensenShannon, mergeFingerprints, DEFAULT_MATCH_BITS, DEFAULT_MISMATCH_BITS, DEFAULT_MIN_CELL_SAMPLES, } from "./answer-fingerprint";
|
|
17
|
+
export type { CompareOptions, CompareResult, CompareVerdict, ProfileVerdict, } from "./answer-fingerprint";
|
|
15
18
|
export type { ThroughputComparison, ThroughputSample } from "./throughput";
|
|
16
19
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,mBAAmB,SAAS,CAAC;AAC7B,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,yBAAyB,EACzB,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,cAAc,EACd,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,mBAAmB,SAAS,CAAC;AAC7B,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,yBAAyB,EACzB,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,cAAc,EACd,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EACV,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/rules/index.js
CHANGED
|
@@ -5,4 +5,5 @@ export { DEFAULT_TIER_SIGNATURES, fingerprintDrifted, judgeTokenizerFingerprint,
|
|
|
5
5
|
export { expectedInputDelta } from "./token-truth";
|
|
6
6
|
export { readResponseMetadata } from "./response-metadata";
|
|
7
7
|
export { compareThroughput, sampleThroughput } from "./throughput";
|
|
8
|
+
export { compareFingerprints, compareToProfiles, fingerprintClusters, jensenShannon, mergeFingerprints, DEFAULT_MATCH_BITS, DEFAULT_MISMATCH_BITS, DEFAULT_MIN_CELL_SAMPLES, } from "./answer-fingerprint";
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
package/dist/rules/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,yBAAyB,EACzB,YAAY,GACb,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,yBAAyB,EACzB,YAAY,GACb,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAMnE,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC"}
|
package/dist/rules/table.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { Rule } from "./types";
|
|
|
4
4
|
* verdict. Evidence rules sit above the probe ladder because they read facts a
|
|
5
5
|
* coached reply cannot fake; note rules only report.
|
|
6
6
|
*/
|
|
7
|
-
export declare const RULES: readonly [Rule<"thinking-floor", "floorReply", "evidence">, Rule<"tokenizer-fingerprint", "fixedText", "evidence">, Rule<"coding-tool", "probes", "probe">, Rule<"scam", "probes", "probe">, Rule<"cjk-leak", "probes", "probe">, Rule<"mux", "probes", "probe">, Rule<"foreign", "probes", "probe">, Rule<"served-model-mismatch", "probes", "probe">, Rule<"substituted", "probes", "probe">, Rule<"quorum", "probes", "probe">, Rule<"tier-self-report", "probes", "note">, Rule<"signature", "thinkingReply", "note">, Rule<"token-truth", "countTokens" | "fixedText", "note">, Rule<"envelope", "probes", "note">, Rule<"throughput", "probes", "note">, Rule<"survey", "survey", "note">];
|
|
7
|
+
export declare const RULES: readonly [Rule<"thinking-floor", "floorReply", "evidence">, Rule<"tokenizer-fingerprint", "fixedText", "evidence">, Rule<"coding-tool", "probes", "probe">, Rule<"scam", "probes", "probe">, Rule<"cjk-leak", "probes", "probe">, Rule<"mux", "probes", "probe">, Rule<"foreign", "probes", "probe">, Rule<"served-model-mismatch", "probes", "probe">, Rule<"substituted", "probes", "probe">, Rule<"quorum", "probes", "probe">, Rule<"tier-self-report", "probes", "note">, Rule<"signature", "thinkingReply", "note">, Rule<"token-truth", "countTokens" | "fixedText", "note">, Rule<"envelope", "probes", "note">, Rule<"throughput", "probes", "note">, Rule<"think-leak", "probes", "note">, Rule<"wrapper-leak", "survey", "note">, Rule<"survey", "survey", "note">, Rule<"answer-fingerprint", "answerFingerprint", "note">];
|
|
8
8
|
type RuleEntry = (typeof RULES)[number];
|
|
9
9
|
export type RuleId = RuleEntry["id"];
|
|
10
10
|
/** Rules that can decide a verdict; a UI naming every rule keys off this. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/rules/table.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/rules/table.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC;;;;GAIG;AACH,eAAO,MAAM,KAAK,yyBAoBkB,CAAC;AAErC,KAAK,SAAS,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AACxC,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AACrC,6EAA6E;AAC7E,MAAM,MAAM,aAAa,GAAG,OAAO,CACjC,SAAS,EACT;IAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAA;CAAE,CAChC,CAAC,IAAI,CAAC,CAAC;AAER,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAGlC,CAAC;AAEnB,eAAO,MAAM,oBAAoB,YAC/B,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,CACH,CAAC;AACX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,0EAA0E;AAC1E,eAAO,MAAM,eAAe;4BACX,aAAa;mBACtB,MAAM;yBACA,UAAU;sBACb,SAAS;;oBAEX,QAAQ;CAC0D,CAAC"}
|