@mingyuxu/check 0.1.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.
Files changed (237) hide show
  1. package/README.md +7 -0
  2. package/dist/critic/critique.d.ts +31 -0
  3. package/dist/critic/critique.d.ts.map +1 -0
  4. package/dist/critic/critique.js +68 -0
  5. package/dist/critic/critique.js.map +1 -0
  6. package/dist/critic/observe.d.ts +48 -0
  7. package/dist/critic/observe.d.ts.map +1 -0
  8. package/dist/critic/observe.js +62 -0
  9. package/dist/critic/observe.js.map +1 -0
  10. package/dist/domain/actions.d.ts +67 -0
  11. package/dist/domain/actions.d.ts.map +1 -0
  12. package/dist/domain/actions.js +123 -0
  13. package/dist/domain/actions.js.map +1 -0
  14. package/dist/domain/invalidation.d.ts +18 -0
  15. package/dist/domain/invalidation.d.ts.map +1 -0
  16. package/dist/domain/invalidation.js +44 -0
  17. package/dist/domain/invalidation.js.map +1 -0
  18. package/dist/domain/registers.d.ts +45 -0
  19. package/dist/domain/registers.d.ts.map +1 -0
  20. package/dist/domain/registers.js +121 -0
  21. package/dist/domain/registers.js.map +1 -0
  22. package/dist/domain/view.d.ts +48 -0
  23. package/dist/domain/view.d.ts.map +1 -0
  24. package/dist/domain/view.js +70 -0
  25. package/dist/domain/view.js.map +1 -0
  26. package/dist/forge/attribution.d.ts +18 -0
  27. package/dist/forge/attribution.d.ts.map +1 -0
  28. package/dist/forge/attribution.js +83 -0
  29. package/dist/forge/attribution.js.map +1 -0
  30. package/dist/forge/bakeoff.d.ts +35 -0
  31. package/dist/forge/bakeoff.d.ts.map +1 -0
  32. package/dist/forge/bakeoff.js +48 -0
  33. package/dist/forge/bakeoff.js.map +1 -0
  34. package/dist/forge/contracts.d.ts +67 -0
  35. package/dist/forge/contracts.d.ts.map +1 -0
  36. package/dist/forge/contracts.js +70 -0
  37. package/dist/forge/contracts.js.map +1 -0
  38. package/dist/forge/evaluate-scenario.d.ts +17 -0
  39. package/dist/forge/evaluate-scenario.d.ts.map +1 -0
  40. package/dist/forge/evaluate-scenario.js +93 -0
  41. package/dist/forge/evaluate-scenario.js.map +1 -0
  42. package/dist/forge/evaluate.d.ts +25 -0
  43. package/dist/forge/evaluate.d.ts.map +1 -0
  44. package/dist/forge/evaluate.js +81 -0
  45. package/dist/forge/evaluate.js.map +1 -0
  46. package/dist/forge/feedback.d.ts +21 -0
  47. package/dist/forge/feedback.d.ts.map +1 -0
  48. package/dist/forge/feedback.js +41 -0
  49. package/dist/forge/feedback.js.map +1 -0
  50. package/dist/forge/reflect.d.ts +35 -0
  51. package/dist/forge/reflect.d.ts.map +1 -0
  52. package/dist/forge/reflect.js +72 -0
  53. package/dist/forge/reflect.js.map +1 -0
  54. package/dist/forge/scorer.d.ts +67 -0
  55. package/dist/forge/scorer.d.ts.map +1 -0
  56. package/dist/forge/scorer.js +99 -0
  57. package/dist/forge/scorer.js.map +1 -0
  58. package/dist/forge/trace.d.ts +25 -0
  59. package/dist/forge/trace.d.ts.map +1 -0
  60. package/dist/forge/trace.js +51 -0
  61. package/dist/forge/trace.js.map +1 -0
  62. package/dist/index.d.ts +78 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +47 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/knowledge/loader.d.ts +19 -0
  67. package/dist/knowledge/loader.d.ts.map +1 -0
  68. package/dist/knowledge/loader.js +76 -0
  69. package/dist/knowledge/loader.js.map +1 -0
  70. package/dist/knowledge/retrieval.d.ts +23 -0
  71. package/dist/knowledge/retrieval.d.ts.map +1 -0
  72. package/dist/knowledge/retrieval.js +100 -0
  73. package/dist/knowledge/retrieval.js.map +1 -0
  74. package/dist/knowledge/skill.d.ts +22 -0
  75. package/dist/knowledge/skill.d.ts.map +1 -0
  76. package/dist/knowledge/skill.js +112 -0
  77. package/dist/knowledge/skill.js.map +1 -0
  78. package/dist/knowledge/write.d.ts +35 -0
  79. package/dist/knowledge/write.d.ts.map +1 -0
  80. package/dist/knowledge/write.js +84 -0
  81. package/dist/knowledge/write.js.map +1 -0
  82. package/dist/manage.d.ts +7 -0
  83. package/dist/manage.d.ts.map +1 -0
  84. package/dist/manage.js +36 -0
  85. package/dist/manage.js.map +1 -0
  86. package/dist/methods/loader.d.ts +18 -0
  87. package/dist/methods/loader.d.ts.map +1 -0
  88. package/dist/methods/loader.js +65 -0
  89. package/dist/methods/loader.js.map +1 -0
  90. package/dist/nodes/aggregate.d.ts +2 -0
  91. package/dist/nodes/aggregate.d.ts.map +1 -0
  92. package/dist/nodes/aggregate.js +101 -0
  93. package/dist/nodes/aggregate.js.map +1 -0
  94. package/dist/nodes/base.d.ts +31 -0
  95. package/dist/nodes/base.d.ts.map +1 -0
  96. package/dist/nodes/base.js +44 -0
  97. package/dist/nodes/base.js.map +1 -0
  98. package/dist/nodes/cognition.d.ts +2 -0
  99. package/dist/nodes/cognition.d.ts.map +1 -0
  100. package/dist/nodes/cognition.js +263 -0
  101. package/dist/nodes/cognition.js.map +1 -0
  102. package/dist/nodes/confidence.d.ts +9 -0
  103. package/dist/nodes/confidence.d.ts.map +1 -0
  104. package/dist/nodes/confidence.js +19 -0
  105. package/dist/nodes/confidence.js.map +1 -0
  106. package/dist/nodes/deliver.d.ts +2 -0
  107. package/dist/nodes/deliver.d.ts.map +1 -0
  108. package/dist/nodes/deliver.js +37 -0
  109. package/dist/nodes/deliver.js.map +1 -0
  110. package/dist/nodes/evidence.d.ts +2 -0
  111. package/dist/nodes/evidence.d.ts.map +1 -0
  112. package/dist/nodes/evidence.js +118 -0
  113. package/dist/nodes/evidence.js.map +1 -0
  114. package/dist/nodes/ground.d.ts +2 -0
  115. package/dist/nodes/ground.d.ts.map +1 -0
  116. package/dist/nodes/ground.js +22 -0
  117. package/dist/nodes/ground.js.map +1 -0
  118. package/dist/nodes/parse.d.ts +2 -0
  119. package/dist/nodes/parse.d.ts.map +1 -0
  120. package/dist/nodes/parse.js +72 -0
  121. package/dist/nodes/parse.js.map +1 -0
  122. package/dist/nodes/scope.d.ts +4 -0
  123. package/dist/nodes/scope.d.ts.map +1 -0
  124. package/dist/nodes/scope.js +63 -0
  125. package/dist/nodes/scope.js.map +1 -0
  126. package/dist/nodes/shape.d.ts +2 -0
  127. package/dist/nodes/shape.d.ts.map +1 -0
  128. package/dist/nodes/shape.js +111 -0
  129. package/dist/nodes/shape.js.map +1 -0
  130. package/dist/ontology/checkskill.d.ts +26 -0
  131. package/dist/ontology/checkskill.d.ts.map +1 -0
  132. package/dist/ontology/checkskill.js +89 -0
  133. package/dist/ontology/checkskill.js.map +1 -0
  134. package/dist/ontology/functions.d.ts +29 -0
  135. package/dist/ontology/functions.d.ts.map +1 -0
  136. package/dist/ontology/functions.js +143 -0
  137. package/dist/ontology/functions.js.map +1 -0
  138. package/dist/ontology/loader.d.ts +44 -0
  139. package/dist/ontology/loader.d.ts.map +1 -0
  140. package/dist/ontology/loader.js +254 -0
  141. package/dist/ontology/loader.js.map +1 -0
  142. package/dist/ontology/runtime-graph.d.ts +22 -0
  143. package/dist/ontology/runtime-graph.d.ts.map +1 -0
  144. package/dist/ontology/runtime-graph.js +111 -0
  145. package/dist/ontology/runtime-graph.js.map +1 -0
  146. package/dist/ontology/store.d.ts +65 -0
  147. package/dist/ontology/store.d.ts.map +1 -0
  148. package/dist/ontology/store.js +179 -0
  149. package/dist/ontology/store.js.map +1 -0
  150. package/dist/parsers/exec.d.ts +9 -0
  151. package/dist/parsers/exec.d.ts.map +1 -0
  152. package/dist/parsers/exec.js +41 -0
  153. package/dist/parsers/exec.js.map +1 -0
  154. package/dist/parsers/runner.d.ts +2 -0
  155. package/dist/parsers/runner.d.ts.map +1 -0
  156. package/dist/parsers/runner.js +26 -0
  157. package/dist/parsers/runner.js.map +1 -0
  158. package/dist/parsers/store.d.ts +32 -0
  159. package/dist/parsers/store.d.ts.map +1 -0
  160. package/dist/parsers/store.js +64 -0
  161. package/dist/parsers/store.js.map +1 -0
  162. package/dist/parsers/synthesize.d.ts +26 -0
  163. package/dist/parsers/synthesize.d.ts.map +1 -0
  164. package/dist/parsers/synthesize.js +63 -0
  165. package/dist/parsers/synthesize.js.map +1 -0
  166. package/dist/planner.d.ts +89 -0
  167. package/dist/planner.d.ts.map +1 -0
  168. package/dist/planner.js +785 -0
  169. package/dist/planner.js.map +1 -0
  170. package/dist/project.d.ts +4 -0
  171. package/dist/project.d.ts.map +1 -0
  172. package/dist/project.js +42 -0
  173. package/dist/project.js.map +1 -0
  174. package/dist/scenario-builder.d.ts +56 -0
  175. package/dist/scenario-builder.d.ts.map +1 -0
  176. package/dist/scenario-builder.js +366 -0
  177. package/dist/scenario-builder.js.map +1 -0
  178. package/dist/schemas/index.d.ts +12 -0
  179. package/dist/schemas/index.d.ts.map +1 -0
  180. package/dist/schemas/index.js +8 -0
  181. package/dist/schemas/index.js.map +1 -0
  182. package/dist/schemas/judgment.d.ts +38 -0
  183. package/dist/schemas/judgment.d.ts.map +1 -0
  184. package/dist/schemas/judgment.js +45 -0
  185. package/dist/schemas/judgment.js.map +1 -0
  186. package/dist/schemas/payloads.d.ts +53 -0
  187. package/dist/schemas/payloads.d.ts.map +1 -0
  188. package/dist/schemas/payloads.js +54 -0
  189. package/dist/schemas/payloads.js.map +1 -0
  190. package/dist/schemas/result.d.ts +36 -0
  191. package/dist/schemas/result.d.ts.map +1 -0
  192. package/dist/schemas/result.js +26 -0
  193. package/dist/schemas/result.js.map +1 -0
  194. package/dist/schemas/spec.d.ts +40 -0
  195. package/dist/schemas/spec.d.ts.map +1 -0
  196. package/dist/schemas/spec.js +82 -0
  197. package/dist/schemas/spec.js.map +1 -0
  198. package/dist/schemas/target.d.ts +28 -0
  199. package/dist/schemas/target.d.ts.map +1 -0
  200. package/dist/schemas/target.js +36 -0
  201. package/dist/schemas/target.js.map +1 -0
  202. package/dist/schemas/workflow.d.ts +21 -0
  203. package/dist/schemas/workflow.d.ts.map +1 -0
  204. package/dist/schemas/workflow.js +100 -0
  205. package/dist/schemas/workflow.js.map +1 -0
  206. package/dist/skills/judge-runner.d.ts +2 -0
  207. package/dist/skills/judge-runner.d.ts.map +1 -0
  208. package/dist/skills/judge-runner.js +29 -0
  209. package/dist/skills/judge-runner.js.map +1 -0
  210. package/dist/skills/judge-synth.d.ts +31 -0
  211. package/dist/skills/judge-synth.d.ts.map +1 -0
  212. package/dist/skills/judge-synth.js +87 -0
  213. package/dist/skills/judge-synth.js.map +1 -0
  214. package/dist/subagents/worker.d.ts +5 -0
  215. package/dist/subagents/worker.d.ts.map +1 -0
  216. package/dist/subagents/worker.js +58 -0
  217. package/dist/subagents/worker.js.map +1 -0
  218. package/dist/workflows/context.d.ts +26 -0
  219. package/dist/workflows/context.d.ts.map +1 -0
  220. package/dist/workflows/context.js +23 -0
  221. package/dist/workflows/context.js.map +1 -0
  222. package/dist/workflows/executor.d.ts +44 -0
  223. package/dist/workflows/executor.d.ts.map +1 -0
  224. package/dist/workflows/executor.js +146 -0
  225. package/dist/workflows/executor.js.map +1 -0
  226. package/dist/workflows/merge.d.ts +4 -0
  227. package/dist/workflows/merge.d.ts.map +1 -0
  228. package/dist/workflows/merge.js +21 -0
  229. package/dist/workflows/merge.js.map +1 -0
  230. package/dist/workflows/run.d.ts +20 -0
  231. package/dist/workflows/run.d.ts.map +1 -0
  232. package/dist/workflows/run.js +66 -0
  233. package/dist/workflows/run.js.map +1 -0
  234. package/knowledge/methods/prose-rule.method.md +21 -0
  235. package/knowledge/methods/ratio-limit.method.md +31 -0
  236. package/knowledge/ontology/verification.yaml +268 -0
  237. package/package.json +36 -0
@@ -0,0 +1,17 @@
1
+ import type { LLMLike } from "../workflows/context.js";
2
+ export declare function evaluateScenario(workspace: string, scenarioKey: string, opts?: {
3
+ llm?: LLMLike | null;
4
+ suite?: string;
5
+ projectRoot?: string;
6
+ gate?: boolean;
7
+ regressionTolerance?: number;
8
+ now?: number;
9
+ }): Promise<Record<string, unknown>>;
10
+ /** 用原 EvaluationSuite 重放;pack 版本不一致时拒绝伪装成可复现结果。 */
11
+ export declare function replayEvaluation(workspace: string, scenarioKey: string, evaluationRunId: string, opts?: {
12
+ llm?: LLMLike | null;
13
+ gate?: boolean;
14
+ now?: number;
15
+ allowPackChange?: boolean;
16
+ }): Promise<Record<string, unknown>>;
17
+ //# sourceMappingURL=evaluate-scenario.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-scenario.d.ts","sourceRoot":"","sources":["../../src/forge/evaluate-scenario.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAKvD,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACpI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0DlC;AAED,mDAAmD;AACnD,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3F,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYlC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * 完整 evaluateScenario —— 对冻结生产线跑 oracle 打分 + 回归门(load_pack 已就位)。
3
+ * 从 Python evaluate.py 组装(scoreAndGate + loadPack)。
4
+ */
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
+ import { join } from "node:path";
7
+ import { createHash } from "node:crypto";
8
+ import { loadPack } from "../knowledge/loader.js";
9
+ import { scoreAndGate } from "./evaluate.js";
10
+ import { loadBuiltinComponents } from "../nodes/base.js";
11
+ import { buildEvaluationContracts } from "./contracts.js";
12
+ import { recordEvaluationContracts } from "../ontology/runtime-graph.js";
13
+ import { attributeEvaluation, latestAttemptDiff } from "./attribution.js";
14
+ export async function evaluateScenario(workspace, scenarioKey, opts = {}) {
15
+ await loadBuiltinComponents();
16
+ const home = join(workspace, scenarioKey);
17
+ const packDir = join(home, "pack");
18
+ if (!existsSync(join(packDir, "pack.json")))
19
+ throw new Error(`场景 ${scenarioKey} 还没有冻结生产线,无可评测。`);
20
+ const pack = loadPack(packDir);
21
+ let oraclePath = join(packDir, "oracle", "gold.json");
22
+ let caseIds = null;
23
+ let suiteName = "full";
24
+ if (opts.suite) {
25
+ let suitePath = opts.suite;
26
+ if (opts.projectRoot && !suitePath.startsWith("/"))
27
+ suitePath = join(opts.projectRoot, suitePath);
28
+ const spec = JSON.parse(readFileSync(suitePath, "utf-8"));
29
+ suiteName = spec.name ?? suitePath.split("/").pop().replace(/\.json$/, "");
30
+ if (spec.oracle ?? spec.oracle_ref) {
31
+ oraclePath = spec.oracle ?? spec.oracle_ref;
32
+ if (opts.projectRoot && !oraclePath.startsWith("/"))
33
+ oraclePath = join(opts.projectRoot, oraclePath);
34
+ }
35
+ caseIds = spec.case_ids ?? null;
36
+ }
37
+ if (!existsSync(oraclePath))
38
+ throw new Error(`没有 oracle(${oraclePath})——冻结时未带标注,或套件路径不对。`);
39
+ let oracle = JSON.parse(readFileSync(oraclePath, "utf-8"));
40
+ if (caseIds) {
41
+ oracle = { ...oracle, cases: oracle.cases.filter((c) => caseIds.includes(c.case_id)) };
42
+ if (!oracle.cases.length)
43
+ throw new Error(`套件 case_ids 与 oracle 无交集: ${caseIds}`);
44
+ }
45
+ const startedAt = Math.floor(opts.now ?? Date.now());
46
+ const result = await scoreAndGate(pack.executor("", { llm: opts.llm }), pack.targets, oracle, {
47
+ scenarioKey, suite: suiteName, historyPath: join(home, "evals", "history.jsonl"),
48
+ gate: opts.gate, regressionTolerance: opts.regressionTolerance,
49
+ });
50
+ const attributions = attributeEvaluation(result);
51
+ const attemptDiff = latestAttemptDiff(home);
52
+ const packVersion = fileDigest(join(packDir, "freeze_manifest.json"));
53
+ const contracts = buildEvaluationContracts({
54
+ scenarioKey, suiteName, oraclePath, oracle, caseIds: oracle.cases.map((row) => row.case_id), packRef: packDir, packVersion, attributions,
55
+ result, startedAt, completedAt: Math.floor(opts.now ?? Date.now()),
56
+ });
57
+ const evalDir = join(home, "evals", contracts.run.eval_run_id);
58
+ mkdirSync(evalDir, { recursive: true });
59
+ writeFileSync(join(evalDir, "suite.json"), JSON.stringify(contracts.suite, null, 2), "utf-8");
60
+ writeFileSync(join(evalDir, "run.json"), JSON.stringify(contracts.run, null, 2), "utf-8");
61
+ writeFileSync(join(evalDir, "report.json"), JSON.stringify(contracts.report, null, 2), "utf-8");
62
+ writeFileSync(join(evalDir, "failures.json"), JSON.stringify(contracts.failures, null, 2), "utf-8");
63
+ writeFileSync(join(evalDir, "attribution.json"), JSON.stringify(attributions, null, 2), "utf-8");
64
+ writeFileSync(join(evalDir, "attempt_diff.json"), JSON.stringify(attemptDiff, null, 2), "utf-8");
65
+ const ontology = recordEvaluationContracts(home, contracts);
66
+ writeFileSync(join(evalDir, "ontology_receipt.json"), JSON.stringify(ontology, null, 2), "utf-8");
67
+ return {
68
+ ...result,
69
+ evaluation_run_id: contracts.run.eval_run_id,
70
+ evaluation_contract_version: contracts.run.schema_version,
71
+ evaluation_dir: evalDir,
72
+ ontology,
73
+ };
74
+ }
75
+ /** 用原 EvaluationSuite 重放;pack 版本不一致时拒绝伪装成可复现结果。 */
76
+ export async function replayEvaluation(workspace, scenarioKey, evaluationRunId, opts = {}) {
77
+ const home = join(workspace, scenarioKey);
78
+ const priorDir = join(home, "evals", evaluationRunId);
79
+ const priorRun = JSON.parse(readFileSync(join(priorDir, "run.json"), "utf-8"));
80
+ const priorReport = JSON.parse(readFileSync(join(priorDir, "report.json"), "utf-8"));
81
+ const currentPackVersion = fileDigest(join(home, "pack", "freeze_manifest.json"));
82
+ if (!opts.allowPackChange && priorRun.pack_version && priorRun.pack_version !== currentPackVersion) {
83
+ throw new Error(`无法严格重放:当前 pack=${currentPackVersion},原评测 pack=${priorRun.pack_version}`);
84
+ }
85
+ const replay = await evaluateScenario(workspace, scenarioKey, { llm: opts.llm, suite: join(priorDir, "suite.json"), gate: opts.gate, now: opts.now });
86
+ const same = ["accuracy", "precision", "recall"].every((key) => normalize(replay[key]) === normalize(priorReport[key]));
87
+ return { ...replay, replay_of: evaluationRunId, replay_match: same };
88
+ }
89
+ function fileDigest(path) {
90
+ return createHash("sha256").update(readFileSync(path)).digest("hex").slice(0, 16);
91
+ }
92
+ function normalize(value) { return value == null ? "null" : JSON.stringify(value); }
93
+ //# sourceMappingURL=evaluate-scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-scenario.js","sourceRoot":"","sources":["../../src/forge/evaluate-scenario.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type Oracle, type ScoreReport } from "./scorer.js";
2
+ import type { Executor } from "../workflows/executor.js";
3
+ import type { Target } from "../schemas/target.js";
4
+ export interface RegressionInfo {
5
+ gate: true;
6
+ tolerance: number;
7
+ baseline_accuracy: number | null;
8
+ delta: number | null;
9
+ is_regression: boolean;
10
+ reason: string;
11
+ new_false_negatives: unknown[];
12
+ }
13
+ /** 同套件的上一条评测(回归门基线)。读在 append 之前,故最后一条即上次结果。 */
14
+ export declare function baselineFor(historyPath: string, suiteName: string): Record<string, any> | null;
15
+ /** 据基线计算回归判定(准确率跌破容差 或 漏报翻转 tp→fn 零容忍)。 */
16
+ export declare function computeRegression(rep: ScoreReport, baseline: Record<string, any> | null, tolerance: number): RegressionInfo;
17
+ /** 评分 + 可选回归门 + append 评测史。executorFactory 让 pack 加载与本文件解耦。 */
18
+ export declare function scoreAndGate(executor: Executor, targets: Target[], oracle: Oracle, opts?: {
19
+ scenarioKey: string;
20
+ suite?: string;
21
+ historyPath?: string;
22
+ gate?: boolean;
23
+ regressionTolerance?: number;
24
+ }): Promise<Record<string, unknown>>;
25
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/forge/evaluate.ts"],"names":[],"mappings":"AAMA,OAAO,EAAU,KAAK,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE,OAAO,EAAE,CAAC;CAChC;AAID,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAU9F;AAED,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAqB3H;AAED,+DAA+D;AAC/D,wBAAsB,YAAY,CAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAwB,GACtI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkBlC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * 评测 + 回归基线门 —— 从 Python evaluate.py 移植核心(load_pack 依赖 knowledge,完整
3
+ * evaluateScenario 在 knowledge 就绪后组装;此处提供可复用的评分+门逻辑)。
4
+ */
5
+ import { existsSync, readFileSync, appendFileSync, mkdirSync } from "node:fs";
6
+ import { dirname } from "node:path";
7
+ import { Scorer } from "./scorer.js";
8
+ const round3 = (x) => Math.round(x * 1000) / 1000;
9
+ /** 同套件的上一条评测(回归门基线)。读在 append 之前,故最后一条即上次结果。 */
10
+ export function baselineFor(historyPath, suiteName) {
11
+ if (!existsSync(historyPath))
12
+ return null;
13
+ let prior = null;
14
+ for (const line of readFileSync(historyPath, "utf-8").split("\n")) {
15
+ if (!line.trim())
16
+ continue;
17
+ let row;
18
+ try {
19
+ row = JSON.parse(line);
20
+ }
21
+ catch {
22
+ continue;
23
+ }
24
+ if (row.suite === suiteName && row.accuracy != null)
25
+ prior = row;
26
+ }
27
+ return prior;
28
+ }
29
+ /** 据基线计算回归判定(准确率跌破容差 或 漏报翻转 tp→fn 零容忍)。 */
30
+ export function computeRegression(rep, baseline, tolerance) {
31
+ const reg = { gate: true, tolerance, baseline_accuracy: null, delta: null, is_regression: false, reason: "", new_false_negatives: [] };
32
+ if (baseline === null) {
33
+ reg.reason = "无同套件基线(首次评测),不判回归";
34
+ return reg;
35
+ }
36
+ const baseAcc = Number(baseline.accuracy);
37
+ reg.baseline_accuracy = baseAcc;
38
+ reg.delta = round3(rep.accuracy - baseAcc);
39
+ const reasons = [];
40
+ if (rep.accuracy < baseAcc - tolerance) {
41
+ reasons.push(`准确率 ${rep.accuracy} 跌破基线 ${baseAcc} - 容差 ${tolerance}(回退 ${Math.abs(reg.delta)})`);
42
+ }
43
+ if (baseline.false_negatives != null && rep.false_negatives?.length) {
44
+ const baseFn = new Set(baseline.false_negatives.map((m) => `${m.case}|${m.target}`));
45
+ const flipped = rep.false_negatives.filter((m) => !baseFn.has(`${m.case}|${m.target}`));
46
+ if (flipped.length) {
47
+ reg.new_false_negatives = flipped;
48
+ reasons.push(`漏报翻转 ${flipped.length} 处:上次抓到的违规这次漏了 ${flipped.map((m) => `${m.case}·${m.target}`).join("、")}`);
49
+ }
50
+ }
51
+ if (reasons.length) {
52
+ reg.is_regression = true;
53
+ reg.reason = reasons.join(";");
54
+ }
55
+ else
56
+ reg.reason = `未跌破容差(Δ=${reg.delta},基线 ${baseAcc}),无漏报翻转`;
57
+ return reg;
58
+ }
59
+ /** 评分 + 可选回归门 + append 评测史。executorFactory 让 pack 加载与本文件解耦。 */
60
+ export async function scoreAndGate(executor, targets, oracle, opts = { scenarioKey: "" }) {
61
+ const suiteName = opts.suite ?? "full";
62
+ const baseline = opts.gate && opts.historyPath ? baselineFor(opts.historyPath, suiteName) : null;
63
+ const rep = await new Scorer(executor).score(targets, oracle);
64
+ const result = {
65
+ scenario_key: opts.scenarioKey, suite: suiteName,
66
+ accuracy: rep.accuracy, n: rep.n, llm_calls: rep.llm_calls,
67
+ per_target: rep.per_target, per_tier: rep.per_tier, mismatches: rep.mismatches,
68
+ };
69
+ for (const k of ["recall", "precision", "confusion", "false_negatives", "false_positives"]) {
70
+ if (rep[k] != null)
71
+ result[k] = rep[k];
72
+ }
73
+ if (opts.gate)
74
+ result.regression = computeRegression(rep, baseline, opts.regressionTolerance ?? 0.02);
75
+ if (opts.historyPath) {
76
+ mkdirSync(dirname(opts.historyPath), { recursive: true });
77
+ appendFileSync(opts.historyPath, JSON.stringify(result) + "\n", "utf-8");
78
+ }
79
+ return result;
80
+ }
81
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/forge/evaluate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAiC,MAAM,aAAa,CAAC;AAcpE,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1D,gDAAgD;AAChD,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,SAAiB;IAChE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,KAAK,GAA+B,IAAI,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QACnD,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI;YAAE,KAAK,GAAG,GAAG,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,iBAAiB,CAAC,GAAgB,EAAE,QAAoC,EAAE,SAAiB;IACzG,MAAM,GAAG,GAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;IACvJ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,GAAG,mBAAmB,CAAC;QAAC,OAAO,GAAG,CAAC;IAAC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC;IAChC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,GAAG,CAAC,QAAQ,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,QAAQ,SAAS,OAAO,SAAS,SAAS,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,QAAQ,CAAC,eAAe,IAAI,IAAI,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAE,QAAQ,CAAC,eAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChG,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChH,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;QAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;;QAC5E,GAAG,CAAC,MAAM,GAAG,WAAW,GAAG,CAAC,KAAK,OAAO,OAAO,SAAS,CAAC;IAC9D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAkB,EAClB,OAAiB,EACjB,MAAc,EACd,OAAoH,EAAE,WAAW,EAAE,EAAE,EAAE;IAEvI,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjG,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,MAAM,GAA4B;QACtC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS;QAChD,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS;QAC1D,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU;KAC/E,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,CAAU,EAAE,CAAC;QACpG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,UAAU,GAAG,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC;IACtG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare const DECISIONS: readonly ["accepted", "rejected", "triaged"];
2
+ export interface Feedback {
3
+ id: string;
4
+ ts: number;
5
+ scenario: string;
6
+ text: string;
7
+ doc: string;
8
+ target: string;
9
+ expected: string;
10
+ status: string;
11
+ note?: string;
12
+ }
13
+ export declare function addFeedback(projectRoot: string, scenario: string, text: string, o?: {
14
+ doc?: string;
15
+ target?: string;
16
+ expected?: string;
17
+ now?: number;
18
+ }): Feedback;
19
+ export declare function listFeedback(projectRoot: string): Feedback[];
20
+ export declare function triageFeedback(projectRoot: string, fbId: string, decision: string, note?: string): Feedback;
21
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/forge/feedback.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,SAAS,8CAA+C,CAAC;AAGtE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IACvD,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CAC9E;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EACnD,CAAC,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,QAAQ,CAQhH;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE,CAI5D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,QAAQ,CAavG"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 反馈队列 —— 业务反馈只进队列,永不直改规则(I9 权限单向)。
3
+ * accepted 的反馈是重开五步的输入:变 oracle case → reset --keep-pack + 带新 oracle 重跑 build。
4
+ * 从 Python feedback.py 忠实移植。
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync, appendFileSync, mkdirSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ export const DECISIONS = ["accepted", "rejected", "triaged"];
9
+ const fbDir = (root) => join(root, "feedback");
10
+ export function addFeedback(projectRoot, scenario, text, o = {}) {
11
+ const dir = fbDir(projectRoot);
12
+ mkdirSync(dir, { recursive: true });
13
+ const pending = join(dir, "pending.jsonl");
14
+ const count = existsSync(pending) ? readFileSync(pending, "utf-8").split("\n").filter((l) => l.trim()).length : 0;
15
+ const entry = { id: `fb-${String(count + 1).padStart(3, "0")}`, ts: o.now ?? Date.now() / 1000, scenario, text, doc: o.doc ?? "", target: o.target ?? "", expected: o.expected ?? "", status: "pending" };
16
+ appendFileSync(pending, JSON.stringify(entry) + "\n", "utf-8");
17
+ return entry;
18
+ }
19
+ export function listFeedback(projectRoot) {
20
+ const p = join(fbDir(projectRoot), "pending.jsonl");
21
+ if (!existsSync(p))
22
+ return [];
23
+ return readFileSync(p, "utf-8").split("\n").filter((l) => l.trim()).map((l) => JSON.parse(l));
24
+ }
25
+ export function triageFeedback(projectRoot, fbId, decision, note = "") {
26
+ if (!DECISIONS.includes(decision))
27
+ throw new Error(`decision 必须是 ${DECISIONS.join("/")}`);
28
+ const dir = fbDir(projectRoot);
29
+ const pending = join(dir, "pending.jsonl");
30
+ const entries = listFeedback(projectRoot);
31
+ const matched = entries.find((e) => e.id === fbId);
32
+ if (!matched)
33
+ throw new Error(`没有待处理反馈 ${fbId}(pending 里有: ${entries.map((e) => e.id).join(", ") || "空"})`);
34
+ const entry = { ...matched, status: decision, note };
35
+ writeFileSync(pending, entries.filter((e) => e.id !== fbId).map((e) => JSON.stringify(e)).join("\n") + (entries.length > 1 ? "\n" : ""), "utf-8");
36
+ const dest = join(dir, decision);
37
+ mkdirSync(dest, { recursive: true });
38
+ writeFileSync(join(dest, `${fbId}.json`), JSON.stringify(entry, null, 2), "utf-8");
39
+ return entry;
40
+ }
41
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/forge/feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 反思引擎(P4 加深)—— 纯逻辑:读评测体系的 per-target FN/FP 明细,做定向修改。
3
+ * 路由:漏报/漏召(FN 为主)→ 放宽取证;误报(FP 为主)→ 收紧(加负向词 + 收窄窗口)。
4
+ * 只动判错的目标,判对的不碰。可测:给合成 report + targets 即可断言修改。
5
+ */
6
+ import type { Target } from "../schemas/target.js";
7
+ import type { Oracle } from "./scorer.js";
8
+ export declare const tokens: (s: string) => string[];
9
+ export declare const nameTokens: (name: string) => string[];
10
+ export interface TargetDiagnosis {
11
+ target_id: string;
12
+ fn: number;
13
+ fp: number;
14
+ suspect: string;
15
+ action: string;
16
+ }
17
+ export interface WinnerReport {
18
+ mismatches?: Array<{
19
+ case: string;
20
+ target: string;
21
+ expected: unknown;
22
+ actual: unknown;
23
+ }>;
24
+ per_target?: Record<string, {
25
+ n: number;
26
+ ok: number;
27
+ accuracy: number;
28
+ }>;
29
+ }
30
+ /** 从 winner 明细做 per-target 归因并定向修改 targets(就地)。返回是否改动 + 每目标诊断。 */
31
+ export declare function reviseFromReport(targets: Target[], report: WinnerReport, oracle?: Oracle): {
32
+ revised: boolean;
33
+ diagnoses: TargetDiagnosis[];
34
+ };
35
+ //# sourceMappingURL=reflect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect.d.ts","sourceRoot":"","sources":["../../src/forge/reflect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,KAAG,MAAM,EAA4B,CAAC;AACtE,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAAM,EAA8B,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,eAAe,EAAE,CAAA;CAAE,CAwC7I"}
@@ -0,0 +1,72 @@
1
+ const canon = (v) => (v == null ? null : String(v).trim());
2
+ const TOKEN = /[\w一-鿿]{2,}/g;
3
+ export const tokens = (s) => (s.match(TOKEN) ?? []);
4
+ export const nameTokens = (name) => tokens(name).slice(0, 6);
5
+ /** 从 winner 明细做 per-target 归因并定向修改 targets(就地)。返回是否改动 + 每目标诊断。 */
6
+ export function reviseFromReport(targets, report, oracle) {
7
+ const stat = new Map();
8
+ for (const m of report.mismatches ?? []) {
9
+ const e = canon(m.expected), a = canon(m.actual);
10
+ const rec = stat.get(m.target) ?? { fn: 0, fp: 0, fpCases: [] };
11
+ if (e === "fail" && a !== "fail")
12
+ rec.fn += 1; // 漏报
13
+ else if (e !== "fail" && a === "fail") {
14
+ rec.fp += 1;
15
+ rec.fpCases.push(m.case);
16
+ } // 误报
17
+ else
18
+ rec.fn += 1; // 非 predicate 的错判:按漏召兜底放宽
19
+ stat.set(m.target, rec);
20
+ }
21
+ const diagnoses = [];
22
+ let revised = false;
23
+ for (const t of targets) {
24
+ const rec = stat.get(t.target_id);
25
+ if (!rec)
26
+ continue; // 全对 → 不动
27
+ const r = (t.retrieval ??= {});
28
+ let action, suspect;
29
+ if (rec.fp > rec.fn) { // 误报为主 → 收紧
30
+ const negs = new Set(r.negative_keywords ?? []);
31
+ const harvested = harvestNegatives(t, rec.fpCases, oracle);
32
+ for (const tok of harvested)
33
+ negs.add(tok);
34
+ r.negative_keywords = [...negs];
35
+ r.window = Math.max(Number(r.window ?? 800) - 200, 300);
36
+ suspect = "误报 / 判据过严或触发过宽";
37
+ action = `加负向词 ${harvested.length} 个 · 收窄窗口→${r.window}`;
38
+ }
39
+ else { // 漏报 / 漏召为主 → 放宽取证
40
+ const kws = new Set(r.content_keywords ?? []);
41
+ for (const tok of nameTokens(t.meta.name ?? t.target_id))
42
+ kws.add(tok);
43
+ const rubric = String(t.judge?.rubric_text ?? "");
44
+ for (const tok of tokens(rubric).slice(0, 4))
45
+ kws.add(tok);
46
+ r.content_keywords = [...kws];
47
+ r.window = Math.min(Number(r.window ?? 800) + 400, 2000);
48
+ suspect = "漏报 / 漏召";
49
+ action = `加检索词→${r.content_keywords.length} · 放宽窗口→${r.window}`;
50
+ }
51
+ diagnoses.push({ target_id: t.target_id, fn: rec.fn, fp: rec.fp, suspect, action });
52
+ revised = true;
53
+ }
54
+ return { revised, diagnoses };
55
+ }
56
+ /** 从误报案例的文档里挖负向词:这些案例本应通过却被判 fail,取其高频词作为筛除线索。 */
57
+ function harvestNegatives(t, fpCaseIds, oracle) {
58
+ if (!oracle || !fpCaseIds.length)
59
+ return [];
60
+ const already = new Set([...(t.retrieval?.content_keywords ?? []), ...nameTokens(t.meta.name ?? "")]);
61
+ const freq = new Map();
62
+ for (const c of oracle.cases) {
63
+ if (!fpCaseIds.includes(c.case_id))
64
+ continue;
65
+ const text = (c.docs ?? []).map((d) => d.text ?? "").join("\n");
66
+ for (const tok of new Set(tokens(text)))
67
+ if (!already.has(tok))
68
+ freq.set(tok, (freq.get(tok) ?? 0) + 1);
69
+ }
70
+ return [...freq.entries()].sort((a, b) => b[1] - a[1]).slice(0, 3).map(([tok]) => tok);
71
+ }
72
+ //# sourceMappingURL=reflect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect.js","sourceRoot":"","sources":["../../src/forge/reflect.ts"],"names":[],"mappings":"AAQA,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACpE,MAAM,KAAK,GAAG,cAAc,CAAC;AAC7B,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAY,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAY,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAe/E,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,OAAiB,EAAE,MAAoB,EAAE,MAAe;IACvF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyD,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAChE,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM;YAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAiB,KAAK;aAC/D,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;YAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC,CAAE,KAAK;;YACnF,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAA6C,0BAA0B;QACxF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,SAAS,CAA2C,UAAU;QACxE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,CAAQ,CAAC;QACtC,IAAI,MAAc,EAAE,OAAe,CAAC;QACpC,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAwC,YAAY;YACxE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAU,CAAC,CAAC,iBAA8B,IAAI,EAAE,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3D,KAAK,MAAM,GAAG,IAAI,SAAS;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAChC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;YACxD,OAAO,GAAG,gBAAgB,CAAC;YAC3B,MAAM,GAAG,QAAQ,SAAS,CAAC,MAAM,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3D,CAAC;aAAM,CAAC,CAAsD,mBAAmB;YAC/E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAU,CAAC,CAAC,gBAA6B,IAAI,EAAE,CAAC,CAAC;YACpE,KAAK,MAAM,GAAG,IAAI,UAAU,CAAE,CAAC,CAAC,IAAI,CAAC,IAAe,IAAI,CAAC,CAAC,SAAS,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnF,MAAM,MAAM,GAAG,MAAM,CAAE,CAAC,CAAC,KAAa,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;YAC3D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3D,CAAC,CAAC,gBAAgB,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YAC9B,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;YACzD,OAAO,GAAG,SAAS,CAAC;YACpB,MAAM,GAAG,QAAS,CAAC,CAAC,gBAA6B,CAAC,MAAM,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC;QAChF,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,kDAAkD;AAClD,SAAS,gBAAgB,CAAC,CAAS,EAAE,SAAmB,EAAE,MAAe;IACvE,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,CAAE,CAAC,CAAC,SAAiB,EAAE,gBAAgB,IAAI,EAAE,CAAC,EAAE,GAAG,UAAU,CAAE,CAAC,CAAC,IAAI,CAAC,IAAe,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnI,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS;QAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACzF,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { Target } from "../schemas/target.js";
2
+ import type { Executor } from "../workflows/executor.js";
3
+ export interface OracleCase {
4
+ case_id: string;
5
+ tier?: string;
6
+ docs: Array<{
7
+ document_id: string;
8
+ text: string;
9
+ received_at?: string;
10
+ doc_type?: string;
11
+ }>;
12
+ expected: Record<string, unknown>;
13
+ }
14
+ export interface Oracle {
15
+ task?: string;
16
+ spec?: string;
17
+ cases: OracleCase[];
18
+ }
19
+ export interface ScoreReport {
20
+ n: number;
21
+ matched: number;
22
+ accuracy: number;
23
+ llm_calls: number;
24
+ per_target: Record<string, {
25
+ n: number;
26
+ ok: number;
27
+ accuracy: number;
28
+ }>;
29
+ per_tier: Record<string, {
30
+ n: number;
31
+ ok: number;
32
+ accuracy: number;
33
+ }>;
34
+ mismatches: Array<{
35
+ case: string;
36
+ target: string;
37
+ expected: unknown;
38
+ actual: unknown;
39
+ }>;
40
+ confusion?: {
41
+ tp: number;
42
+ fn: number;
43
+ fp: number;
44
+ tn: number;
45
+ };
46
+ recall?: number | null;
47
+ precision?: number | null;
48
+ false_negatives?: Array<{
49
+ case: string;
50
+ target: string;
51
+ expected: unknown;
52
+ actual: unknown;
53
+ }>;
54
+ false_positives?: Array<{
55
+ case: string;
56
+ target: string;
57
+ expected: unknown;
58
+ actual: unknown;
59
+ }>;
60
+ }
61
+ export declare class Scorer {
62
+ private ex;
63
+ constructor(ex: Executor);
64
+ private run;
65
+ score(targets: Target[], oracle: Oracle): Promise<ScoreReport>;
66
+ }
67
+ //# sourceMappingURL=scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../../src/forge/scorer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGzD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5F,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AACD,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACxF,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9F,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC/F;AAKD,qBAAa,MAAM;IACL,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;YAElB,GAAG;IAoBX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAqDrE"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Eval 台 —— 对着标注 oracle 给 spec 打分。predicate 比 verdict、extraction 比 value。
3
+ * predicate 额外出混淆矩阵(fail=阳性)/召回/精确/分层。从 Python scorer.py 忠实移植(异步)。
4
+ */
5
+ import { DocumentIR } from "../schemas/payloads.js";
6
+ const canon = (v) => (v == null ? null : String(v).trim());
7
+ const round3 = (x) => Math.round(x * 1000) / 1000;
8
+ export class Scorer {
9
+ ex;
10
+ constructor(ex) {
11
+ this.ex = ex;
12
+ }
13
+ async run(targets, c) {
14
+ const ledger = { calls: 0, record() { this.calls += 1; } };
15
+ const unit = this.ex.spec.unit();
16
+ let res;
17
+ if (unit === "per_doc_rule") {
18
+ const d = c.docs[0];
19
+ res = await this.ex.runDocument(new DocumentIR(d.document_id), targets, { rawText: d.text, ledger });
20
+ }
21
+ else {
22
+ res = await this.ex.runCase(targets, c.docs, { ledger });
23
+ }
24
+ this._lastCost = ledger.calls;
25
+ const out = {};
26
+ for (const r of res.results) {
27
+ if (r.value != null)
28
+ out[r.target_id] = r.value;
29
+ else if (r.comparison)
30
+ out[r.target_id] = r.comparison.actual;
31
+ else
32
+ out[r.target_id] = r.verdict;
33
+ }
34
+ return out;
35
+ }
36
+ async score(targets, oracle) {
37
+ let total = 0, matched = 0, llmCalls = 0;
38
+ const per = {};
39
+ const perTier = {};
40
+ const mismatches = [];
41
+ const predicate = oracle.task === "predicate";
42
+ const conf = { tp: 0, fn: 0, fp: 0, tn: 0 };
43
+ const falseNeg = [];
44
+ const falsePos = [];
45
+ for (const c of oracle.cases) {
46
+ const got = await this.run(targets, c);
47
+ llmCalls += this._lastCost ?? 0;
48
+ const tier = c.tier ?? "untiered";
49
+ for (const [tid, expected] of Object.entries(c.expected)) {
50
+ total += 1;
51
+ const actual = got[tid];
52
+ const ok = canon(actual) === canon(expected);
53
+ (per[tid] ??= { n: 0, ok: 0 }).n += 1;
54
+ per[tid].ok += ok ? 1 : 0;
55
+ (perTier[tier] ??= { n: 0, ok: 0 }).n += 1;
56
+ perTier[tier].ok += ok ? 1 : 0;
57
+ if (ok)
58
+ matched += 1;
59
+ else
60
+ mismatches.push({ case: c.case_id, target: tid, expected, actual });
61
+ if (predicate) {
62
+ const expPos = canon(expected) === "fail";
63
+ const actPos = canon(actual) === "fail";
64
+ if (expPos && actPos)
65
+ conf.tp += 1;
66
+ else if (expPos && !actPos) {
67
+ conf.fn += 1;
68
+ falseNeg.push({ case: c.case_id, target: tid, expected, actual });
69
+ }
70
+ else if (!expPos && actPos) {
71
+ conf.fp += 1;
72
+ falsePos.push({ case: c.case_id, target: tid, expected, actual });
73
+ }
74
+ else
75
+ conf.tn += 1;
76
+ }
77
+ }
78
+ }
79
+ const out = {
80
+ n: total, matched,
81
+ accuracy: total ? round3(matched / total) : 0.0,
82
+ llm_calls: llmCalls,
83
+ per_target: Object.fromEntries(Object.entries(per).map(([k, v]) => [k, { ...v, accuracy: round3(v.ok / v.n) }])),
84
+ per_tier: Object.fromEntries(Object.entries(perTier).map(([k, v]) => [k, { ...v, accuracy: round3(v.ok / v.n) }])),
85
+ mismatches,
86
+ };
87
+ if (predicate) {
88
+ const pos = conf.tp + conf.fn;
89
+ const rep = conf.tp + conf.fp;
90
+ out.confusion = conf;
91
+ out.recall = pos ? round3(conf.tp / pos) : null;
92
+ out.precision = rep ? round3(conf.tp / rep) : null;
93
+ out.false_negatives = falseNeg;
94
+ out.false_positives = falsePos;
95
+ }
96
+ return out;
97
+ }
98
+ }
99
+ //# sourceMappingURL=scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../src/forge/scorer.ts"],"names":[],"mappings":"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"}