@cavelang/cli 0.27.14 → 0.29.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/Authors.md +5 -0
- package/License.md +6 -0
- package/README.md +122 -24
- package/dist/internal/act/action.d.ts +69 -0
- package/dist/internal/act/action.d.ts.map +1 -0
- package/dist/internal/act/action.js +201 -0
- package/dist/internal/act/action.js.map +1 -0
- package/dist/internal/act/declare.d.ts +102 -0
- package/dist/internal/act/declare.d.ts.map +1 -0
- package/dist/internal/act/declare.js +270 -0
- package/dist/internal/act/declare.js.map +1 -0
- package/dist/internal/act/engine.d.ts +103 -0
- package/dist/internal/act/engine.d.ts.map +1 -0
- package/dist/internal/act/engine.js +298 -0
- package/dist/internal/act/engine.js.map +1 -0
- package/dist/internal/act/index.d.ts +27 -0
- package/dist/internal/act/index.d.ts.map +1 -0
- package/dist/internal/act/index.js +25 -0
- package/dist/internal/act/index.js.map +1 -0
- package/dist/internal/automate/automation.d.ts +78 -0
- package/dist/internal/automate/automation.d.ts.map +1 -0
- package/dist/internal/automate/automation.js +135 -0
- package/dist/internal/automate/automation.js.map +1 -0
- package/dist/internal/automate/declare.d.ts +84 -0
- package/dist/internal/automate/declare.d.ts.map +1 -0
- package/dist/internal/automate/declare.js +233 -0
- package/dist/internal/automate/declare.js.map +1 -0
- package/dist/internal/automate/engine.d.ts +125 -0
- package/dist/internal/automate/engine.d.ts.map +1 -0
- package/dist/internal/automate/engine.js +388 -0
- package/dist/internal/automate/engine.js.map +1 -0
- package/dist/internal/automate/index.d.ts +28 -0
- package/dist/internal/automate/index.d.ts.map +1 -0
- package/dist/internal/automate/index.js +26 -0
- package/dist/internal/automate/index.js.map +1 -0
- package/dist/internal/automate/main.d.ts +26 -0
- package/dist/internal/automate/main.d.ts.map +1 -0
- package/dist/internal/automate/main.js +298 -0
- package/dist/internal/automate/main.js.map +1 -0
- package/dist/internal/connect/index.d.ts +26 -0
- package/dist/internal/connect/index.d.ts.map +1 -0
- package/dist/internal/connect/index.js +24 -0
- package/dist/internal/connect/index.js.map +1 -0
- package/dist/internal/connect/main.d.ts +23 -0
- package/dist/internal/connect/main.d.ts.map +1 -0
- package/dist/internal/connect/main.js +330 -0
- package/dist/internal/connect/main.js.map +1 -0
- package/dist/internal/connect/run.d.ts +85 -0
- package/dist/internal/connect/run.d.ts.map +1 -0
- package/dist/internal/connect/run.js +242 -0
- package/dist/internal/connect/run.js.map +1 -0
- package/dist/internal/connect/source.d.ts +44 -0
- package/dist/internal/connect/source.d.ts.map +1 -0
- package/dist/internal/connect/source.js +215 -0
- package/dist/internal/connect/source.js.map +1 -0
- package/dist/internal/connect/template.d.ts +69 -0
- package/dist/internal/connect/template.d.ts.map +1 -0
- package/dist/internal/connect/template.js +221 -0
- package/dist/internal/connect/template.js.map +1 -0
- package/dist/internal/eval/index.d.ts +28 -0
- package/dist/internal/eval/index.d.ts.map +1 -0
- package/dist/internal/eval/index.js +27 -0
- package/dist/internal/eval/index.js.map +1 -0
- package/dist/internal/eval/judge.d.ts +30 -0
- package/dist/internal/eval/judge.d.ts.map +1 -0
- package/dist/internal/eval/judge.js +101 -0
- package/dist/internal/eval/judge.js.map +1 -0
- package/dist/internal/eval/loop.d.ts +64 -0
- package/dist/internal/eval/loop.d.ts.map +1 -0
- package/dist/internal/eval/loop.js +123 -0
- package/dist/internal/eval/loop.js.map +1 -0
- package/dist/internal/eval/main.d.ts +17 -0
- package/dist/internal/eval/main.d.ts.map +1 -0
- package/dist/internal/eval/main.js +236 -0
- package/dist/internal/eval/main.js.map +1 -0
- package/dist/internal/eval/queries.d.ts +74 -0
- package/dist/internal/eval/queries.d.ts.map +1 -0
- package/dist/internal/eval/queries.js +161 -0
- package/dist/internal/eval/queries.js.map +1 -0
- package/dist/internal/eval/run.d.ts +143 -0
- package/dist/internal/eval/run.d.ts.map +1 -0
- package/dist/internal/eval/run.js +376 -0
- package/dist/internal/eval/run.js.map +1 -0
- package/dist/internal/eval/score.d.ts +81 -0
- package/dist/internal/eval/score.d.ts.map +1 -0
- package/dist/internal/eval/score.js +126 -0
- package/dist/internal/eval/score.js.map +1 -0
- package/dist/internal/eval/suite.d.ts +66 -0
- package/dist/internal/eval/suite.d.ts.map +1 -0
- package/dist/internal/eval/suite.js +130 -0
- package/dist/internal/eval/suite.js.map +1 -0
- package/dist/internal/ingest/context.d.ts +20 -0
- package/dist/internal/ingest/context.d.ts.map +1 -0
- package/dist/internal/ingest/context.js +59 -0
- package/dist/internal/ingest/context.js.map +1 -0
- package/dist/internal/ingest/files.d.ts +46 -0
- package/dist/internal/ingest/files.d.ts.map +1 -0
- package/dist/internal/ingest/files.js +115 -0
- package/dist/internal/ingest/files.js.map +1 -0
- package/dist/internal/ingest/index.d.ts +31 -0
- package/dist/internal/ingest/index.d.ts.map +1 -0
- package/dist/internal/ingest/index.js +29 -0
- package/dist/internal/ingest/index.js.map +1 -0
- package/dist/internal/ingest/main.d.ts +12 -0
- package/dist/internal/ingest/main.d.ts.map +1 -0
- package/dist/internal/ingest/main.js +180 -0
- package/dist/internal/ingest/main.js.map +1 -0
- package/dist/internal/ingest/prompt.d.ts +32 -0
- package/dist/internal/ingest/prompt.d.ts.map +1 -0
- package/dist/internal/ingest/prompt.js +75 -0
- package/dist/internal/ingest/prompt.js.map +1 -0
- package/dist/internal/ingest/run.d.ts +142 -0
- package/dist/internal/ingest/run.d.ts.map +1 -0
- package/dist/internal/ingest/run.js +350 -0
- package/dist/internal/ingest/run.js.map +1 -0
- package/dist/internal/ingest/web.d.ts +48 -0
- package/dist/internal/ingest/web.d.ts.map +1 -0
- package/dist/internal/ingest/web.js +140 -0
- package/dist/internal/ingest/web.js.map +1 -0
- package/dist/internal/loop/demo.d.ts +22 -0
- package/dist/internal/loop/demo.d.ts.map +1 -0
- package/dist/internal/loop/demo.js +67 -0
- package/dist/internal/loop/demo.js.map +1 -0
- package/dist/internal/loop/index.d.ts +20 -0
- package/dist/internal/loop/index.d.ts.map +1 -0
- package/dist/internal/loop/index.js +17 -0
- package/dist/internal/loop/index.js.map +1 -0
- package/dist/internal/loop/llm.d.ts +99 -0
- package/dist/internal/loop/llm.d.ts.map +1 -0
- package/dist/internal/loop/llm.js +231 -0
- package/dist/internal/loop/llm.js.map +1 -0
- package/dist/internal/loop/reconstruct.d.ts +87 -0
- package/dist/internal/loop/reconstruct.d.ts.map +1 -0
- package/dist/internal/loop/reconstruct.js +157 -0
- package/dist/internal/loop/reconstruct.js.map +1 -0
- package/dist/internal/loop/sqlite.d.ts +13 -0
- package/dist/internal/loop/sqlite.d.ts.map +1 -0
- package/dist/internal/loop/sqlite.js +33 -0
- package/dist/internal/loop/sqlite.js.map +1 -0
- package/dist/internal/loop/store.d.ts +50 -0
- package/dist/internal/loop/store.d.ts.map +1 -0
- package/dist/internal/loop/store.js +100 -0
- package/dist/internal/loop/store.js.map +1 -0
- package/dist/internal/mcp/bin.d.ts +7 -0
- package/dist/internal/mcp/bin.d.ts.map +1 -0
- package/dist/internal/mcp/bin.js +8 -0
- package/dist/internal/mcp/bin.js.map +1 -0
- package/dist/internal/mcp/index.d.ts +25 -0
- package/dist/internal/mcp/index.d.ts.map +1 -0
- package/dist/internal/mcp/index.js +23 -0
- package/dist/internal/mcp/index.js.map +1 -0
- package/dist/internal/mcp/main.d.ts +23 -0
- package/dist/internal/mcp/main.d.ts.map +1 -0
- package/dist/internal/mcp/main.js +156 -0
- package/dist/internal/mcp/main.js.map +1 -0
- package/dist/internal/mcp/server.d.ts +92 -0
- package/dist/internal/mcp/server.d.ts.map +1 -0
- package/dist/internal/mcp/server.js +251 -0
- package/dist/internal/mcp/server.js.map +1 -0
- package/dist/internal/mcp/tools.d.ts +91 -0
- package/dist/internal/mcp/tools.d.ts.map +1 -0
- package/dist/internal/mcp/tools.js +584 -0
- package/dist/internal/mcp/tools.js.map +1 -0
- package/dist/internal/rules/declare.d.ts +58 -0
- package/dist/internal/rules/declare.d.ts.map +1 -0
- package/dist/internal/rules/declare.js +152 -0
- package/dist/internal/rules/declare.js.map +1 -0
- package/dist/internal/rules/engine.d.ts +125 -0
- package/dist/internal/rules/engine.d.ts.map +1 -0
- package/dist/internal/rules/engine.js +575 -0
- package/dist/internal/rules/engine.js.map +1 -0
- package/dist/internal/rules/index.d.ts +23 -0
- package/dist/internal/rules/index.d.ts.map +1 -0
- package/dist/internal/rules/index.js +21 -0
- package/dist/internal/rules/index.js.map +1 -0
- package/dist/internal/rules/rule.d.ts +88 -0
- package/dist/internal/rules/rule.d.ts.map +1 -0
- package/dist/internal/rules/rule.js +221 -0
- package/dist/internal/rules/rule.js.map +1 -0
- package/dist/internal/shape/check.d.ts +118 -0
- package/dist/internal/shape/check.d.ts.map +1 -0
- package/dist/internal/shape/check.js +331 -0
- package/dist/internal/shape/check.js.map +1 -0
- package/dist/internal/shape/client.d.ts +31 -0
- package/dist/internal/shape/client.d.ts.map +1 -0
- package/dist/internal/shape/client.js +170 -0
- package/dist/internal/shape/client.js.map +1 -0
- package/dist/internal/shape/gate.d.ts +33 -0
- package/dist/internal/shape/gate.d.ts.map +1 -0
- package/dist/internal/shape/gate.js +0 -0
- package/dist/internal/shape/gate.js.map +1 -0
- package/dist/internal/shape/index.d.ts +27 -0
- package/dist/internal/shape/index.d.ts.map +1 -0
- package/dist/internal/shape/index.js +23 -0
- package/dist/internal/shape/index.js.map +1 -0
- package/dist/internal/shape/suggest.d.ts +82 -0
- package/dist/internal/shape/suggest.d.ts.map +1 -0
- package/dist/internal/shape/suggest.js +374 -0
- package/dist/internal/shape/suggest.js.map +1 -0
- package/dist/internal/sync/index.d.ts +22 -0
- package/dist/internal/sync/index.d.ts.map +1 -0
- package/dist/internal/sync/index.js +21 -0
- package/dist/internal/sync/index.js.map +1 -0
- package/dist/internal/sync/sync.d.ts +95 -0
- package/dist/internal/sync/sync.d.ts.map +1 -0
- package/dist/internal/sync/sync.js +342 -0
- package/dist/internal/sync/sync.js.map +1 -0
- package/dist/internal/view/api.d.ts +196 -0
- package/dist/internal/view/api.d.ts.map +1 -0
- package/dist/internal/view/api.js +189 -0
- package/dist/internal/view/api.js.map +1 -0
- package/dist/internal/view/index.d.ts +33 -0
- package/dist/internal/view/index.d.ts.map +1 -0
- package/dist/internal/view/index.js +30 -0
- package/dist/internal/view/index.js.map +1 -0
- package/dist/internal/view/main.d.ts +11 -0
- package/dist/internal/view/main.d.ts.map +1 -0
- package/dist/internal/view/main.js +98 -0
- package/dist/internal/view/main.js.map +1 -0
- package/dist/internal/view/page.d.ts +14 -0
- package/dist/internal/view/page.d.ts.map +1 -0
- package/dist/internal/view/page.js +370 -0
- package/dist/internal/view/page.js.map +1 -0
- package/dist/internal/view/report.d.ts +52 -0
- package/dist/internal/view/report.d.ts.map +1 -0
- package/dist/internal/view/report.js +367 -0
- package/dist/internal/view/report.js.map +1 -0
- package/dist/internal/view/scope.d.ts +11 -0
- package/dist/internal/view/scope.d.ts.map +1 -0
- package/dist/internal/view/scope.js +41 -0
- package/dist/internal/view/scope.js.map +1 -0
- package/dist/internal/view/server.d.ts +35 -0
- package/dist/internal/view/server.d.ts.map +1 -0
- package/dist/internal/view/server.js +141 -0
- package/dist/internal/view/server.js.map +1 -0
- package/dist/src/act.d.ts +3 -0
- package/dist/src/act.d.ts.map +1 -0
- package/dist/src/act.js +3 -0
- package/dist/src/act.js.map +1 -0
- package/dist/src/automate.d.ts +3 -0
- package/dist/src/automate.d.ts.map +1 -0
- package/dist/src/automate.js +3 -0
- package/dist/src/automate.js.map +1 -0
- package/dist/src/cli.d.ts +24 -17
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +408 -107
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands.d.ts +104 -0
- package/dist/src/commands.d.ts.map +1 -0
- package/dist/src/commands.js +33 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/connect.d.ts +3 -0
- package/dist/src/connect.d.ts.map +1 -0
- package/dist/src/connect.js +3 -0
- package/dist/src/connect.js.map +1 -0
- package/dist/src/dispatch.d.ts +14 -0
- package/dist/src/dispatch.d.ts.map +1 -0
- package/dist/src/dispatch.js +116 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/doctor.d.ts +45 -0
- package/dist/src/doctor.d.ts.map +1 -0
- package/dist/src/doctor.js +284 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/eval.d.ts +3 -0
- package/dist/src/eval.d.ts.map +1 -0
- package/dist/src/eval.js +3 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/index.d.ts +9 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/ingest.d.ts +3 -0
- package/dist/src/ingest.d.ts.map +1 -0
- package/dist/src/ingest.js +3 -0
- package/dist/src/ingest.js.map +1 -0
- package/dist/src/loop.d.ts +3 -0
- package/dist/src/loop.d.ts.map +1 -0
- package/dist/src/loop.js +3 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/main.d.ts +1 -1
- package/dist/src/main.d.ts.map +1 -1
- package/dist/src/main.js +3 -75
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp.d.ts +3 -0
- package/dist/src/mcp.d.ts.map +1 -0
- package/dist/src/mcp.js +3 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/rules.d.ts +3 -0
- package/dist/src/rules.d.ts.map +1 -0
- package/dist/src/rules.js +3 -0
- package/dist/src/rules.js.map +1 -0
- package/dist/src/shape.d.ts +3 -0
- package/dist/src/shape.d.ts.map +1 -0
- package/dist/src/shape.js +3 -0
- package/dist/src/shape.js.map +1 -0
- package/dist/src/sync.d.ts +3 -0
- package/dist/src/sync.d.ts.map +1 -0
- package/dist/src/sync.js +3 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/view.d.ts +3 -0
- package/dist/src/view.d.ts.map +1 -0
- package/dist/src/view.js +3 -0
- package/dist/src/view.js.map +1 -0
- package/package.json +81 -21
- package/src/act.ts +2 -0
- package/src/automate.ts +2 -0
- package/src/cli.ts +416 -102
- package/src/commands.ts +48 -0
- package/src/connect.ts +2 -0
- package/src/dispatch.ts +141 -0
- package/src/doctor.ts +370 -0
- package/src/eval.ts +2 -0
- package/src/index.ts +9 -2
- package/src/ingest.ts +2 -0
- package/src/loop.ts +2 -0
- package/src/main.ts +3 -66
- package/src/mcp.ts +2 -0
- package/src/rules.ts +2 -0
- package/src/shape.ts +2 -0
- package/src/sync.ts +2 -0
- package/src/view.ts +2 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The extraction, query, and reconstruction eval orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* For every case, N times: open a fresh throwaway store, drive the agent
|
|
5
|
+
* over the case's source through `@cavelang/cli/ingest` (same prompts, same
|
|
6
|
+
* mcp/stdout protocols, same shell/function agent contract as
|
|
7
|
+
* `cave ingest`), then score what landed against the golden and run the
|
|
8
|
+
* case's query expectations. Fresh stores keep runs independent — no
|
|
9
|
+
* digest skipping, no cross-case naming leakage — and make N runs measure
|
|
10
|
+
* extraction *variance*, not accumulation.
|
|
11
|
+
*
|
|
12
|
+
* Reconstruction cases (a `<stem>.loop.cave` sibling, spec §18)
|
|
13
|
+
* run the §18 loop instead: build an in-memory graph from the source
|
|
14
|
+
* knowledge, reconstruct from the declared seeds — the deterministic
|
|
15
|
+
* heuristic without an agent (the baseline), `llmPolicy` over the agent
|
|
16
|
+
* template otherwise — then score the collected claims against the golden
|
|
17
|
+
* and run the queries against *the reconstruction*, not the knowledge.
|
|
18
|
+
*
|
|
19
|
+
* Before any agent money is spent, each fixture is self-checked: the
|
|
20
|
+
* golden must parse cleanly, contain claims, and satisfy its own queries
|
|
21
|
+
* in a scratch store; loop fixtures additionally need seeds that appear
|
|
22
|
+
* in the knowledge and a golden the knowledge can actually yield. A
|
|
23
|
+
* fixture that fails is reported and skipped — a broken ruler measures
|
|
24
|
+
* nothing.
|
|
25
|
+
*
|
|
26
|
+
* Agent runs that fail (non-zero exit, timeout, thrown function) score
|
|
27
|
+
* nothing and are excluded from means; they surface in `failed` instead.
|
|
28
|
+
*/
|
|
29
|
+
import * as Ingest from '@cavelang/cli/ingest';
|
|
30
|
+
import type { Store } from '@cavelang/store';
|
|
31
|
+
import * as Queries from './queries.ts';
|
|
32
|
+
/**
|
|
33
|
+
* Extraction agent: a shell template (the `cave ingest` contract —
|
|
34
|
+
* prompt on stdin, `{prompt-file}`/`{mcp-config}`/`{db}` substituted) or
|
|
35
|
+
* a function. Functions additionally receive the run's throwaway store,
|
|
36
|
+
* so SDK scripts can write to it directly in `mcp` mode. Reconstruction
|
|
37
|
+
* cases reuse the same agent as the loop policy's completion function —
|
|
38
|
+
* prompt on stdin (and `{prompt-file}`), the reply on stdout.
|
|
39
|
+
*/
|
|
40
|
+
export type Agent = string | ((prompt: string, files: readonly string[], context: {
|
|
41
|
+
db: string;
|
|
42
|
+
store: Store;
|
|
43
|
+
}) => Promise<string>);
|
|
44
|
+
/** Judge agent: shell template (prompt on stdin, `{prompt-file}`) or function. */
|
|
45
|
+
export type Judge = string | ((prompt: string) => Promise<string>);
|
|
46
|
+
export type Options = {
|
|
47
|
+
/** Suite directories (searched for `*.golden.cave`) or single golden files. */
|
|
48
|
+
readonly suites: readonly string[];
|
|
49
|
+
/**
|
|
50
|
+
* Optional only for suites of reconstruction cases, which fall back to
|
|
51
|
+
* the heuristic baseline; extraction cases without an agent fail.
|
|
52
|
+
*/
|
|
53
|
+
readonly agent?: Agent;
|
|
54
|
+
/** Optional judge upgrading strict misses to semantic matches. */
|
|
55
|
+
readonly judge?: Judge;
|
|
56
|
+
/** Agent runs per case (default 1). */
|
|
57
|
+
readonly runs?: number;
|
|
58
|
+
/** Agent protocol, as in `cave ingest` (default `mcp`). */
|
|
59
|
+
readonly mode?: Ingest.Mode;
|
|
60
|
+
/** Inline source contents into prompts (default `true` — fixtures are self-contained). */
|
|
61
|
+
readonly embed?: boolean;
|
|
62
|
+
/** Instructions markdown overriding the per-case/per-suite resolution. */
|
|
63
|
+
readonly instructions?: string;
|
|
64
|
+
/** Relative numeric value tolerance in [0, 1] (default 0 — exact). */
|
|
65
|
+
readonly tolerance?: number;
|
|
66
|
+
/** Resolve query expectations through the alias closure (spec §13.6). */
|
|
67
|
+
readonly aliases?: boolean;
|
|
68
|
+
readonly timeoutSeconds?: number;
|
|
69
|
+
/** Open throwaway stores without the standard §5.5 registry. */
|
|
70
|
+
readonly noPrelude?: boolean;
|
|
71
|
+
/** Keep the per-run databases (reported as `root`) instead of deleting them. */
|
|
72
|
+
readonly keep?: boolean;
|
|
73
|
+
readonly cwd?: string;
|
|
74
|
+
};
|
|
75
|
+
/** One agent run of one case. */
|
|
76
|
+
export type RunReport = {
|
|
77
|
+
readonly ok: boolean;
|
|
78
|
+
/** Failure note or the agent's final line. */
|
|
79
|
+
readonly note?: string;
|
|
80
|
+
/** Ingest problems (stdout-mode lint) — the run still scores. */
|
|
81
|
+
readonly problems: readonly string[];
|
|
82
|
+
readonly golden: number;
|
|
83
|
+
readonly produced: number;
|
|
84
|
+
readonly matched: number;
|
|
85
|
+
readonly valueOff: number;
|
|
86
|
+
/** Judge-paired misses (0 without a judge). */
|
|
87
|
+
readonly judged: number;
|
|
88
|
+
readonly judgeError?: string;
|
|
89
|
+
/** Canonical lines of unmatched golden claims (judged pairs excluded). */
|
|
90
|
+
readonly misses: readonly string[];
|
|
91
|
+
/** Canonical lines of unmatched produced claims (judged pairs excluded). */
|
|
92
|
+
readonly extras: readonly string[];
|
|
93
|
+
readonly precision: number;
|
|
94
|
+
readonly recall: number;
|
|
95
|
+
readonly f1: number;
|
|
96
|
+
readonly judgedPrecision?: number;
|
|
97
|
+
readonly judgedRecall?: number;
|
|
98
|
+
readonly judgedF1?: number;
|
|
99
|
+
readonly queries: readonly Queries.Outcome[];
|
|
100
|
+
readonly queriesPassed: number;
|
|
101
|
+
/** The run's database, when `keep` is set. */
|
|
102
|
+
readonly db?: string;
|
|
103
|
+
};
|
|
104
|
+
export type Mean = {
|
|
105
|
+
readonly precision: number;
|
|
106
|
+
readonly recall: number;
|
|
107
|
+
readonly f1: number;
|
|
108
|
+
readonly judgedF1?: number;
|
|
109
|
+
/** Query expectations passed / checked, over ok runs — absent without queries. */
|
|
110
|
+
readonly queryRate?: number;
|
|
111
|
+
};
|
|
112
|
+
export type CaseReport = {
|
|
113
|
+
readonly name: string;
|
|
114
|
+
/** What the case evals: agent extraction, or §18 reconstruction (item 10). */
|
|
115
|
+
readonly kind: 'extraction' | 'loop';
|
|
116
|
+
/** Source file name, for the report. */
|
|
117
|
+
readonly source: string;
|
|
118
|
+
/** Fixture problems; a non-empty list means the case ran nothing. */
|
|
119
|
+
readonly fixture: readonly string[];
|
|
120
|
+
readonly golden: number;
|
|
121
|
+
readonly queryCount: number;
|
|
122
|
+
readonly runs: readonly RunReport[];
|
|
123
|
+
/** Means over this case's ok runs — absent when none succeeded. */
|
|
124
|
+
readonly mean?: Mean;
|
|
125
|
+
};
|
|
126
|
+
export type Report = {
|
|
127
|
+
readonly cases: readonly CaseReport[];
|
|
128
|
+
/** Requested runs per case. */
|
|
129
|
+
readonly runs: number;
|
|
130
|
+
readonly okRuns: number;
|
|
131
|
+
readonly failedRuns: number;
|
|
132
|
+
/** Suite-level discovery problems — goldens that never became cases; per-case problems live on their `CaseReport`. */
|
|
133
|
+
readonly fixture: readonly string[];
|
|
134
|
+
/** Means over all ok runs of all cases — absent when none succeeded. */
|
|
135
|
+
readonly mean?: Mean;
|
|
136
|
+
/** Directory holding the per-run databases, when `keep` is set. */
|
|
137
|
+
readonly root?: string;
|
|
138
|
+
};
|
|
139
|
+
/** Runs the full eval. */
|
|
140
|
+
export declare const run: (options: Options) => Promise<Report>;
|
|
141
|
+
/** @returns the total fixture problems — suite discovery plus per-case. */
|
|
142
|
+
export declare const fixtureCount: (report: Report) => number;
|
|
143
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The extraction, query, and reconstruction eval orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* For every case, N times: open a fresh throwaway store, drive the agent
|
|
5
|
+
* over the case's source through `@cavelang/cli/ingest` (same prompts, same
|
|
6
|
+
* mcp/stdout protocols, same shell/function agent contract as
|
|
7
|
+
* `cave ingest`), then score what landed against the golden and run the
|
|
8
|
+
* case's query expectations. Fresh stores keep runs independent — no
|
|
9
|
+
* digest skipping, no cross-case naming leakage — and make N runs measure
|
|
10
|
+
* extraction *variance*, not accumulation.
|
|
11
|
+
*
|
|
12
|
+
* Reconstruction cases (a `<stem>.loop.cave` sibling, spec §18)
|
|
13
|
+
* run the §18 loop instead: build an in-memory graph from the source
|
|
14
|
+
* knowledge, reconstruct from the declared seeds — the deterministic
|
|
15
|
+
* heuristic without an agent (the baseline), `llmPolicy` over the agent
|
|
16
|
+
* template otherwise — then score the collected claims against the golden
|
|
17
|
+
* and run the queries against *the reconstruction*, not the knowledge.
|
|
18
|
+
*
|
|
19
|
+
* Before any agent money is spent, each fixture is self-checked: the
|
|
20
|
+
* golden must parse cleanly, contain claims, and satisfy its own queries
|
|
21
|
+
* in a scratch store; loop fixtures additionally need seeds that appear
|
|
22
|
+
* in the knowledge and a golden the knowledge can actually yield. A
|
|
23
|
+
* fixture that fails is reported and skipped — a broken ruler measures
|
|
24
|
+
* nothing.
|
|
25
|
+
*
|
|
26
|
+
* Agent runs that fail (non-zero exit, timeout, thrown function) score
|
|
27
|
+
* nothing and are excluded from means; they surface in `failed` instead.
|
|
28
|
+
*/
|
|
29
|
+
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
30
|
+
import { tmpdir } from 'node:os';
|
|
31
|
+
import { basename, dirname, join } from 'node:path';
|
|
32
|
+
import { Registry, canonicalizeText, emitClaim, standardRegistry } from '@cavelang/canonical';
|
|
33
|
+
import * as Ingest from '@cavelang/cli/ingest';
|
|
34
|
+
import { memoryStoreOfText } from '@cavelang/cli/loop';
|
|
35
|
+
import { open } from '@cavelang/store';
|
|
36
|
+
import * as Suite from "./suite.js";
|
|
37
|
+
import * as Score from "./score.js";
|
|
38
|
+
import * as Queries from "./queries.js";
|
|
39
|
+
import * as Loop from "./loop.js";
|
|
40
|
+
import { judgePrompt, parsePairs } from "./judge.js";
|
|
41
|
+
const readText = (path) => readFileSync(path, 'utf8');
|
|
42
|
+
const mean = (values) => values.length === 0 ? 0 : values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
43
|
+
const meanOf = (runs, judged) => {
|
|
44
|
+
const ok = runs.filter(run => run.ok);
|
|
45
|
+
if (ok.length === 0) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const checked = ok.reduce((sum, run) => sum + run.queries.length, 0);
|
|
49
|
+
return {
|
|
50
|
+
precision: mean(ok.map(run => run.precision)),
|
|
51
|
+
recall: mean(ok.map(run => run.recall)),
|
|
52
|
+
f1: mean(ok.map(run => run.f1)),
|
|
53
|
+
...judged ? { judgedF1: mean(ok.map(run => run.judgedF1 ?? run.f1)) } : {},
|
|
54
|
+
...checked > 0 ? { queryRate: ok.reduce((sum, run) => sum + run.queriesPassed, 0) / checked } : {}
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Loop-fixture checks beyond the golden's own: the knowledge must parse
|
|
59
|
+
* and have claims, the spec must validate, every seed must appear in the
|
|
60
|
+
* knowledge, and every golden claim must exist in the knowledge — the
|
|
61
|
+
* loop selects claims, it cannot invent them, so an unreachable golden
|
|
62
|
+
* measures the fixture, not the policy.
|
|
63
|
+
*/
|
|
64
|
+
const loopFixtureOf = (kase, facts, registry) => {
|
|
65
|
+
const problems = [];
|
|
66
|
+
const knowledge = readText(kase.source);
|
|
67
|
+
const parsed = canonicalizeText(knowledge, registry);
|
|
68
|
+
problems.push(...parsed.problems.map(problem => `knowledge line ${problem.line}: ${problem.message}`));
|
|
69
|
+
if (parsed.claims.length === 0) {
|
|
70
|
+
problems.push('knowledge has no claims');
|
|
71
|
+
}
|
|
72
|
+
const { spec, problems: specProblems } = Loop.parseSpec(readText(kase.loop), registry);
|
|
73
|
+
problems.push(...specProblems);
|
|
74
|
+
if (problems.length === 0) {
|
|
75
|
+
const graph = memoryStoreOfText(knowledge, registry);
|
|
76
|
+
for (const seed of spec.seeds) {
|
|
77
|
+
if (graph.claimsAbout(seed).length === 0) {
|
|
78
|
+
problems.push(`seed '${seed}' does not appear in the knowledge`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const known = Score.factsOf(parsed.claims.map(entry => entry.claim));
|
|
82
|
+
const unreachable = Score.compare(facts, known);
|
|
83
|
+
problems.push(...unreachable.misses.map(fact => `golden claim not in the knowledge: ${Score.lineOf(fact)}`));
|
|
84
|
+
}
|
|
85
|
+
return { problems, loop: { spec, knowledge } };
|
|
86
|
+
};
|
|
87
|
+
/** Self-checks one fixture; returns its problems and parsed pieces. */
|
|
88
|
+
const fixtureOf = (kase, registry, aliases) => {
|
|
89
|
+
const problems = [];
|
|
90
|
+
const goldenText = readText(kase.golden);
|
|
91
|
+
const { facts, problems: goldenProblems } = Score.goldenFacts(goldenText, registry);
|
|
92
|
+
problems.push(...goldenProblems);
|
|
93
|
+
if (facts.length === 0) {
|
|
94
|
+
problems.push('golden has no claims');
|
|
95
|
+
}
|
|
96
|
+
let loop;
|
|
97
|
+
if (kase.loop !== undefined) {
|
|
98
|
+
const checked = loopFixtureOf({ ...kase, loop: kase.loop }, facts, registry);
|
|
99
|
+
problems.push(...checked.problems);
|
|
100
|
+
loop = checked.loop;
|
|
101
|
+
}
|
|
102
|
+
let queries = [];
|
|
103
|
+
if (kase.queries !== undefined) {
|
|
104
|
+
const parsed = Queries.parseQueries(readText(kase.queries));
|
|
105
|
+
problems.push(...parsed.problems);
|
|
106
|
+
queries = parsed.queries;
|
|
107
|
+
}
|
|
108
|
+
if (problems.length === 0 && queries.length > 0) {
|
|
109
|
+
// The golden itself must satisfy the queries — otherwise the
|
|
110
|
+
// expectations measure the fixture, not the agent.
|
|
111
|
+
const scratch = open(':memory:', { registry });
|
|
112
|
+
try {
|
|
113
|
+
scratch.ingest(goldenText);
|
|
114
|
+
for (const q of queries) {
|
|
115
|
+
const outcome = Queries.checkQuery(scratch, q, { aliases });
|
|
116
|
+
if (!outcome.pass) {
|
|
117
|
+
const detail = outcome.error ??
|
|
118
|
+
[
|
|
119
|
+
...outcome.missing.map(solution => `missing ${Queries.formatSolution(solution)}`),
|
|
120
|
+
...outcome.unexpected.map(record => `unexpected ${Queries.formatSolution(record)}`)
|
|
121
|
+
].join(', ');
|
|
122
|
+
problems.push(`queries line ${q.line}: the golden does not satisfy '${q.pattern.split('\n')[0]}' (${detail})`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
scratch.close();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return { problems, facts, queries, ...loop === undefined ? {} : { loop } };
|
|
131
|
+
};
|
|
132
|
+
const runJudge = async (judge, comparison, timeoutSeconds, cwd) => {
|
|
133
|
+
if (comparison.misses.length === 0 || comparison.extras.length === 0) {
|
|
134
|
+
return { pairs: [] };
|
|
135
|
+
}
|
|
136
|
+
const prompt = judgePrompt(comparison.misses, comparison.extras);
|
|
137
|
+
let output;
|
|
138
|
+
if (typeof judge === 'function') {
|
|
139
|
+
try {
|
|
140
|
+
output = await judge(prompt);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
return { pairs: [], error: error instanceof Error ? error.message : String(error) };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
const promptDir = mkdtempSync(join(tmpdir(), 'cave-judge-'));
|
|
148
|
+
try {
|
|
149
|
+
const promptFile = join(promptDir, 'judge.md');
|
|
150
|
+
writeFileSync(promptFile, prompt);
|
|
151
|
+
const result = await Ingest.runShellAgent(judge, prompt, { 'prompt-file': promptFile }, timeoutSeconds, cwd);
|
|
152
|
+
if (result.code !== 0) {
|
|
153
|
+
return { pairs: [], error: result.error ?? `judge exited with ${result.code}` };
|
|
154
|
+
}
|
|
155
|
+
output = result.stdout;
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
rmSync(promptDir, { recursive: true, force: true });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return { pairs: parsePairs(output, comparison.misses.length, comparison.extras.length) };
|
|
162
|
+
};
|
|
163
|
+
/** Runs the full eval. */
|
|
164
|
+
export const run = async (options) => {
|
|
165
|
+
const cwd = options.cwd ?? process.cwd();
|
|
166
|
+
const runs = options.runs ?? 1;
|
|
167
|
+
const mode = options.mode ?? 'mcp';
|
|
168
|
+
const timeoutSeconds = options.timeoutSeconds ?? 600;
|
|
169
|
+
const registry = options.noPrelude === true ? Registry.empty : standardRegistry;
|
|
170
|
+
const suite = Suite.discover(options.suites, {
|
|
171
|
+
cwd,
|
|
172
|
+
...options.instructions === undefined ? {} : { instructions: options.instructions }
|
|
173
|
+
});
|
|
174
|
+
const root = mkdtempSync(join(tmpdir(), 'cave-eval-'));
|
|
175
|
+
const cases = [];
|
|
176
|
+
try {
|
|
177
|
+
for (const [caseIndex, kase] of suite.cases.entries()) {
|
|
178
|
+
const kind = kase.loop === undefined ? 'extraction' : 'loop';
|
|
179
|
+
const fixture = fixtureOf(kase, registry, options.aliases === true);
|
|
180
|
+
if (fixture.problems.length > 0) {
|
|
181
|
+
cases.push({
|
|
182
|
+
name: kase.name,
|
|
183
|
+
kind,
|
|
184
|
+
source: basename(kase.source),
|
|
185
|
+
fixture: fixture.problems,
|
|
186
|
+
golden: fixture.facts.length,
|
|
187
|
+
queryCount: fixture.queries.length,
|
|
188
|
+
runs: []
|
|
189
|
+
});
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const caseRuns = [];
|
|
193
|
+
for (let runNo = 1; runNo <= runs; runNo += 1) {
|
|
194
|
+
const runOptions = { ...options, mode, timeoutSeconds, cwd };
|
|
195
|
+
caseRuns.push(fixture.loop === undefined ?
|
|
196
|
+
await runOnce(kase, fixture, caseIndex, runNo, root, registry, runOptions) :
|
|
197
|
+
await runLoopOnce(kase, fixture.loop, fixture, caseIndex, runNo, root, registry, runOptions));
|
|
198
|
+
}
|
|
199
|
+
const caseMean = meanOf(caseRuns, options.judge !== undefined);
|
|
200
|
+
cases.push({
|
|
201
|
+
name: kase.name,
|
|
202
|
+
kind,
|
|
203
|
+
source: basename(kase.source),
|
|
204
|
+
fixture: [],
|
|
205
|
+
golden: fixture.facts.length,
|
|
206
|
+
queryCount: fixture.queries.length,
|
|
207
|
+
runs: caseRuns,
|
|
208
|
+
...caseMean === undefined ? {} : { mean: caseMean }
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
if (options.keep !== true) {
|
|
214
|
+
rmSync(root, { recursive: true, force: true });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const allRuns = cases.flatMap(kase => kase.runs);
|
|
218
|
+
const overall = meanOf(allRuns, options.judge !== undefined);
|
|
219
|
+
return {
|
|
220
|
+
cases,
|
|
221
|
+
runs,
|
|
222
|
+
okRuns: allRuns.filter(run => run.ok).length,
|
|
223
|
+
failedRuns: allRuns.filter(run => !run.ok).length,
|
|
224
|
+
fixture: suite.problems,
|
|
225
|
+
...overall === undefined ? {} : { mean: overall },
|
|
226
|
+
...options.keep === true ? { root } : {}
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
/** @returns the total fixture problems — suite discovery plus per-case. */
|
|
230
|
+
export const fixtureCount = (report) => report.fixture.length + report.cases.reduce((sum, kase) => sum + kase.fixture.length, 0);
|
|
231
|
+
const failedRun = (golden, note) => ({
|
|
232
|
+
ok: false,
|
|
233
|
+
note,
|
|
234
|
+
problems: [],
|
|
235
|
+
golden,
|
|
236
|
+
produced: 0,
|
|
237
|
+
matched: 0,
|
|
238
|
+
valueOff: 0,
|
|
239
|
+
judged: 0,
|
|
240
|
+
misses: [],
|
|
241
|
+
extras: [],
|
|
242
|
+
precision: 0,
|
|
243
|
+
recall: 0,
|
|
244
|
+
f1: 0,
|
|
245
|
+
queries: [],
|
|
246
|
+
queriesPassed: 0
|
|
247
|
+
});
|
|
248
|
+
/**
|
|
249
|
+
* The scoring tail every case kind shares: compare the store's produced
|
|
250
|
+
* facts against the golden, optionally judge the leftovers, run the query
|
|
251
|
+
* expectations, assemble the report.
|
|
252
|
+
*/
|
|
253
|
+
const scoreRun = async (store, db, kase, fixture, head, options) => {
|
|
254
|
+
const produced = Score.producedFacts(store);
|
|
255
|
+
const comparison = Score.compare(fixture.facts, produced, {
|
|
256
|
+
...options.tolerance === undefined ? {} : { tolerance: options.tolerance }
|
|
257
|
+
});
|
|
258
|
+
let judged = 0;
|
|
259
|
+
let judgeError;
|
|
260
|
+
let misses = comparison.misses;
|
|
261
|
+
let extras = comparison.extras;
|
|
262
|
+
if (options.judge !== undefined) {
|
|
263
|
+
const outcome = await runJudge(options.judge, comparison, options.timeoutSeconds, dirname(kase.source));
|
|
264
|
+
judged = outcome.pairs.length;
|
|
265
|
+
judgeError = outcome.error;
|
|
266
|
+
const judgedMisses = new Set(outcome.pairs.map(([miss]) => miss));
|
|
267
|
+
const judgedExtras = new Set(outcome.pairs.map(([, extra]) => extra));
|
|
268
|
+
misses = comparison.misses.filter((_, index) => !judgedMisses.has(index));
|
|
269
|
+
extras = comparison.extras.filter((_, index) => !judgedExtras.has(index));
|
|
270
|
+
}
|
|
271
|
+
const outcomes = fixture.queries.map(q => Queries.checkQuery(store, q, { aliases: options.aliases === true }));
|
|
272
|
+
const judgedPrecision = comparison.produced === 0 ? 0 : (comparison.matched + judged) / comparison.produced;
|
|
273
|
+
const judgedRecall = comparison.golden === 0 ? 0 : (comparison.matched + judged) / comparison.golden;
|
|
274
|
+
return {
|
|
275
|
+
ok: true,
|
|
276
|
+
...head.note === undefined ? {} : { note: head.note },
|
|
277
|
+
problems: head.problems,
|
|
278
|
+
golden: comparison.golden,
|
|
279
|
+
produced: comparison.produced,
|
|
280
|
+
matched: comparison.matched,
|
|
281
|
+
valueOff: comparison.valueOff,
|
|
282
|
+
judged,
|
|
283
|
+
...judgeError === undefined ? {} : { judgeError },
|
|
284
|
+
misses: misses.map(Score.lineOf),
|
|
285
|
+
extras: extras.map(Score.lineOf),
|
|
286
|
+
precision: comparison.precision,
|
|
287
|
+
recall: comparison.recall,
|
|
288
|
+
f1: comparison.f1,
|
|
289
|
+
...options.judge === undefined ? {} : {
|
|
290
|
+
judgedPrecision,
|
|
291
|
+
judgedRecall,
|
|
292
|
+
judgedF1: Score.f1Of(judgedPrecision, judgedRecall)
|
|
293
|
+
},
|
|
294
|
+
queries: outcomes,
|
|
295
|
+
queriesPassed: outcomes.filter(outcome => outcome.pass).length,
|
|
296
|
+
...options.keep === true ? { db } : {}
|
|
297
|
+
};
|
|
298
|
+
};
|
|
299
|
+
const runOnce = async (kase, fixture, caseIndex, runNo, root, registry, options) => {
|
|
300
|
+
const db = join(root, `case-${caseIndex + 1}-run-${runNo}.db`);
|
|
301
|
+
const store = open(db, { registry });
|
|
302
|
+
try {
|
|
303
|
+
const evalAgent = options.agent;
|
|
304
|
+
const agent = typeof evalAgent === 'function' ?
|
|
305
|
+
(prompt, files) => evalAgent(prompt, files, { db, store }) :
|
|
306
|
+
evalAgent;
|
|
307
|
+
const report = await Ingest.run({
|
|
308
|
+
db,
|
|
309
|
+
store,
|
|
310
|
+
patterns: [],
|
|
311
|
+
// A literal path, not a pattern — discovered names may contain
|
|
312
|
+
// glob metacharacters (BUGS.md eval-glob-escape).
|
|
313
|
+
files: [basename(kase.source)],
|
|
314
|
+
cwd: dirname(kase.source),
|
|
315
|
+
mode: options.mode,
|
|
316
|
+
// Eval must score valid lines from imperfect model output and report
|
|
317
|
+
// lint problems, not discard the run under ingest's strict default.
|
|
318
|
+
// Every eval database is already an isolated throwaway store.
|
|
319
|
+
policy: 'lenient',
|
|
320
|
+
...agent === undefined ? {} : { agent },
|
|
321
|
+
embed: options.embed !== false,
|
|
322
|
+
timeoutSeconds: options.timeoutSeconds,
|
|
323
|
+
noPrelude: options.noPrelude === true,
|
|
324
|
+
...kase.instructions === undefined ? {} : { instructions: kase.instructions }
|
|
325
|
+
});
|
|
326
|
+
const batch = report.batches[0];
|
|
327
|
+
const scoreablePartial = batch !== undefined && batch.added > 0 && batch.problems.length > 0;
|
|
328
|
+
if (batch === undefined || (!batch.ok && !scoreablePartial)) {
|
|
329
|
+
return failedRun(fixture.facts.length, batch?.note ?? 'agent produced no batch');
|
|
330
|
+
}
|
|
331
|
+
return await scoreRun(store, db, kase, fixture, {
|
|
332
|
+
...batch.note === undefined ? {} : { note: batch.note },
|
|
333
|
+
problems: batch.problems
|
|
334
|
+
}, options);
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
return failedRun(fixture.facts.length, error instanceof Error ? error.message : String(error));
|
|
338
|
+
}
|
|
339
|
+
finally {
|
|
340
|
+
store.close();
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
/**
|
|
344
|
+
* One reconstruction run (item 10): the loop selects claims from the
|
|
345
|
+
* knowledge graph in memory; what it collected lands in the throwaway
|
|
346
|
+
* store — un-stamped, like `cave import`, so claim keys survive — and the
|
|
347
|
+
* shared tail scores it and asks the queries *of the reconstruction*.
|
|
348
|
+
* The run note records the expansion path.
|
|
349
|
+
*/
|
|
350
|
+
const runLoopOnce = async (kase, loop, fixture, caseIndex, runNo, root, registry, options) => {
|
|
351
|
+
const db = join(root, `case-${caseIndex + 1}-run-${runNo}.db`);
|
|
352
|
+
const store = open(db, { registry });
|
|
353
|
+
try {
|
|
354
|
+
const evalAgent = options.agent;
|
|
355
|
+
const agent = typeof evalAgent === 'function' ?
|
|
356
|
+
prompt => evalAgent(prompt, [], { db, store }) :
|
|
357
|
+
evalAgent;
|
|
358
|
+
const reconstruction = await Loop.runSpec(loop.knowledge, loop.spec, registry, {
|
|
359
|
+
...agent === undefined ? {} : { agent },
|
|
360
|
+
timeoutSeconds: options.timeoutSeconds,
|
|
361
|
+
cwd: dirname(kase.source)
|
|
362
|
+
});
|
|
363
|
+
const ingested = store.ingest(reconstruction.claims.map(claim => emitClaim(claim)).join('\n'));
|
|
364
|
+
return await scoreRun(store, db, kase, fixture, {
|
|
365
|
+
note: Loop.traceNote(reconstruction),
|
|
366
|
+
problems: ingested.problems.map(problem => `line ${problem.line}: ${problem.message}`)
|
|
367
|
+
}, options);
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
return failedRun(fixture.facts.length, error instanceof Error ? error.message : String(error));
|
|
371
|
+
}
|
|
372
|
+
finally {
|
|
373
|
+
store.close();
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claim scoring — the produced extraction against the golden (roadmap
|
|
3
|
+
* item 9).
|
|
4
|
+
*
|
|
5
|
+
* Both sides run through the same pipeline: parse → canonicalize → strip
|
|
6
|
+
* actor stamps → re-key → keep the last claim per key. Actor stamps are
|
|
7
|
+
* the `@src:` contexts appended by the engine itself under spec §9.5
|
|
8
|
+
* (`@src:cli`, `@src:agent/<name>`, `@src:ingest`) — which actor
|
|
9
|
+
* happened to write a claim must not shift its key away from the golden's,
|
|
10
|
+
* while *content* sources the fixture author wrote (`@src:maria`,
|
|
11
|
+
* `@src:notes.md`) stay part of claim identity: the golden decides which
|
|
12
|
+
* contexts extraction is expected to produce.
|
|
13
|
+
*
|
|
14
|
+
* A golden claim *matches* a produced claim when their normalized keys are
|
|
15
|
+
* equal and their values agree — numerically within a relative tolerance
|
|
16
|
+
* (units must agree; `~` approximation is metadata), textually otherwise.
|
|
17
|
+
* Relation and existence claims carry their object in the key, so the key
|
|
18
|
+
* alone decides. Confidence, tags, `+/-` uncertainty, importance and
|
|
19
|
+
* comments are metadata and never scored; a key that matches with a
|
|
20
|
+
* disagreeing value is counted separately (`valueOff`) — the right fact,
|
|
21
|
+
* the wrong value.
|
|
22
|
+
*/
|
|
23
|
+
import { Claim } from '@cavelang/core';
|
|
24
|
+
import type { Registry } from '@cavelang/canonical';
|
|
25
|
+
import type { Store } from '@cavelang/store';
|
|
26
|
+
/** @returns the claim without engine-appended actor stamps. */
|
|
27
|
+
export declare const normalize: (claim: Claim.t) => Claim.t;
|
|
28
|
+
/** @returns the claim key of the normalized claim. */
|
|
29
|
+
export declare const keyOf: (claim: Claim.t) => string;
|
|
30
|
+
/** One fact under a normalized key — the unit of comparison. */
|
|
31
|
+
export type Fact = {
|
|
32
|
+
readonly key: string;
|
|
33
|
+
readonly claim: Claim.t;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* @returns one fact per normalized key, the last claim winning — the same
|
|
37
|
+
* latest-wins semantics the store gives a belief series (spec §9.1).
|
|
38
|
+
*/
|
|
39
|
+
export declare const factsOf: (claims: readonly Claim.t[]) => Fact[];
|
|
40
|
+
/** Parses a golden document into facts; parse problems are fixture problems. */
|
|
41
|
+
export declare const goldenFacts: (text: string, registry?: Registry.t) => {
|
|
42
|
+
facts: readonly Fact[];
|
|
43
|
+
problems: readonly string[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* @returns the facts an extraction run produced — the store's current
|
|
47
|
+
* beliefs minus the orchestrator's own `ingest-digest` provenance claims
|
|
48
|
+
* (`@cavelang/cli/ingest` bookkeeping, not extracted knowledge).
|
|
49
|
+
*/
|
|
50
|
+
export declare const producedFacts: (store: Store) => Fact[];
|
|
51
|
+
/**
|
|
52
|
+
* @returns whether the produced value agrees with the golden's: equal
|
|
53
|
+
* numbers (within `tolerance`, relative to the golden) under equal units,
|
|
54
|
+
* or the exact same canonical text. Claims without a value (relations,
|
|
55
|
+
* existence) always agree — their key already carries the object.
|
|
56
|
+
*/
|
|
57
|
+
export declare const valueAgrees: (golden: Claim.t, produced: Claim.t, tolerance?: number) => boolean;
|
|
58
|
+
export type Comparison = {
|
|
59
|
+
readonly golden: number;
|
|
60
|
+
readonly produced: number;
|
|
61
|
+
/** Facts whose key and value both agree. */
|
|
62
|
+
readonly matched: number;
|
|
63
|
+
/** Keys present on both sides with disagreeing values — right fact, wrong value. */
|
|
64
|
+
readonly valueOff: number;
|
|
65
|
+
/** Golden facts with no match. */
|
|
66
|
+
readonly misses: readonly Fact[];
|
|
67
|
+
/** Produced facts with no match. */
|
|
68
|
+
readonly extras: readonly Fact[];
|
|
69
|
+
readonly precision: number;
|
|
70
|
+
readonly recall: number;
|
|
71
|
+
readonly f1: number;
|
|
72
|
+
};
|
|
73
|
+
/** @returns the F1 of a precision/recall pair, 0 when both are 0. */
|
|
74
|
+
export declare const f1Of: (precision: number, recall: number) => number;
|
|
75
|
+
/** Compares produced facts against golden facts. */
|
|
76
|
+
export declare const compare: (golden: readonly Fact[], produced: readonly Fact[], options?: {
|
|
77
|
+
tolerance?: number;
|
|
78
|
+
}) => Comparison;
|
|
79
|
+
/** @returns the canonical line of a fact, for reports and judge prompts. */
|
|
80
|
+
export declare const lineOf: (fact: Fact) => string;
|
|
81
|
+
//# sourceMappingURL=score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,KAAK,EAAc,MAAM,gBAAgB,CAAA;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAK5C,+DAA+D;AAC/D,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,CAAC,CAAC,KAAG,KAAK,CAAC,CAGhD,CAAA;AAED,sDAAsD;AACtD,eAAO,MAAM,KAAK,GAAI,OAAO,KAAK,CAAC,CAAC,KAAG,MACb,CAAA;AAE1B,gEAAgE;AAChE,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;CACxB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,QAAQ,SAAS,KAAK,CAAC,CAAC,EAAE,KAAG,IAAI,EAMxD,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,EACZ,WAAU,QAAQ,CAAC,CAAoB,KACtC;IAAE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAMvD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,KAAG,IAAI,EAK9C,CAAA;AAOH;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,UAAU,KAAK,CAAC,CAAC,EAAE,kBAAa,KAAG,OAc/E,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAA;IAChC,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB,CAAA;AAKD,qEAAqE;AACrE,eAAO,MAAM,IAAI,GAAI,WAAW,MAAM,EAAE,QAAQ,MAAM,KAAG,MACuB,CAAA;AAEhF,oDAAoD;AACpD,eAAO,MAAM,OAAO,GAClB,QAAQ,SAAS,IAAI,EAAE,EACvB,UAAU,SAAS,IAAI,EAAE,EACzB,UAAS;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,KACnC,UAgCF,CAAA;AAED,4EAA4E;AAC5E,eAAO,MAAM,MAAM,GAAI,MAAM,IAAI,KAAG,MACF,CAAA"}
|