@catheadowl/dsh-eval 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,57 @@
1
+ ---
2
+ description: Release history of @catheadowl/dsh-eval — one entry per published version, following Keep a Changelog conventions
3
+ ---
4
+
5
+ # Changelog
6
+
7
+ All notable changes to `@catheadowl/dsh-eval` are documented here. Versions
8
+ follow [Semantic Versioning](https://semver.org/); entries follow
9
+ [Keep a Changelog](https://keepachangelog.com/) conventions.
10
+
11
+ ## [0.2.1] — 2026-09-09
12
+
13
+ ### Added
14
+
15
+ - Subagent dispatch observability: `subagentChildren` projection plus
16
+ `subagentDispatched` / `subagentCompleted` matchers.
17
+ - Multi-turn followups: cross-turn asynchronous driving for review
18
+ experiments, with dispatch/completion count assertions.
19
+
20
+ ### Changed
21
+
22
+ - `dsh-review` boots a **blank environment by default**: staged out-of-tree
23
+ plugin rows are disabled via overlay, so host-profile gates/plugins can no
24
+ longer steer or crash a reviewer. Pass `--keep-plugin-rows` (or executor
25
+ option `keepPluginRows`) to opt back in deliberately.
26
+
27
+ ### Fixed
28
+
29
+ - Review artifacts capture the reviewer's **answer**, not the last message:
30
+ conclusions use the last assistant text before any plugin-sourced injection
31
+ (trace-derived); the raw final message is kept as `run-N.stdout.txt` when it
32
+ diverges, and each report run cites its transcript.
33
+
34
+ ## [0.2.0] — 2026-09-06
35
+
36
+ ### Changed
37
+
38
+ - **BREAKING (0.x minor)**: public API split into two tiers. The root entry
39
+ is now the SDK tier only (assertion DSL, step builders, `runEvalCase`,
40
+ `defineReviewExperiment`); low-level sandbox/overlay/trace primitives and
41
+ review execution moved to the `./experimental` escape-hatch subpath.
42
+ - `exports` map added — deep path imports are now mechanically blocked.
43
+
44
+ ## [0.1.0] — 2026-09-05
45
+
46
+ ### Added
47
+
48
+ - Initial public release: case runner over dsh headless runs,
49
+ session-trace assertions, and a scripted mock-LLM layer for plugin intent
50
+ tests.
51
+ - CLI binaries `dsh-eval` (run cases) and `dsh-review` (LLM output review);
52
+ `@deepseek-ai/dsh-llm` is a peerDependency provided by the host
53
+ ecosystem.
54
+
55
+ [0.2.1]: https://github.com/CatheadOwl/dsh-eval/releases/tag/v0.2.1
56
+ [0.2.0]: https://github.com/CatheadOwl/dsh-eval/releases/tag/v0.2.0
57
+ [0.1.0]: https://github.com/CatheadOwl/dsh-eval/releases/tag/v0.1.0
@@ -0,0 +1,6 @@
1
+ # Bilingual README pairing record (adapted from deepseek-harness docs/i18n): the sha256 of each
2
+ # side as of the last confirmed-consistent state. Both languages carry equal authority; after
3
+ # editing either side, bring the other along and re-record with:
4
+ # node scripts/verify-readme-i18n.mjs --write
5
+ README.md: 94e4e6c1172544c94c65329abf8dc6db81c0ba8030c354e1c1e8e64f8bc8276b
6
+ README.zh.md: a1f45726e695fe46931a2988c7293d53c61b3c275dc92e039e707b315f72fc60
package/README.md CHANGED
@@ -1,39 +1,37 @@
1
- ---
2
- description: '@catheadowl/dsh-eval — dsh-native agent evaluation layer for plugin authors:behavior case 跑真实 headless dsh trace,review experiment 测 fresh model 能否理解插件输出'
3
- ---
4
-
5
1
  # @catheadowl/dsh-eval
6
2
 
3
+ English | [中文](README.zh.md)
4
+
7
5
  **A dsh-native agent evaluation layer for plugin authors**: behavior cases run against real headless dsh traces, while review experiments test whether fresh models understand plugin outputs.
8
6
 
9
- 它评测的是**装配后的 agent harness**(插件 + profile + patch + 工具注册表在真实 dsh headless 里接成的那张图),不是孤立函数;判定走 dsh 原生的 session trace 投影与 matcher(契约断言),不是 metric 分数。它不是通用 agent eval 平台(无 dashboard / dataset hosting / metric catalog,也不做 benchmark 排名),也不是 DeepEval / OpenAI Evals 的替代品——那些项目证明了这个问题空间成立,本包选择 dsh-native 的垂直解法。
7
+ It evaluates the **assembled agent harness** (the graph a plugin + profile + patch + tool registry form inside a real dsh headless run), not isolated functions; verdicts come from dsh-native session-trace projections and matchers (contract assertions), not metric scores. It is not a general agent-eval platform (no dashboard / dataset hosting / metric catalog, no benchmark ranking) and not a DeepEval / OpenAI Evals replacement — those projects proved the problem space; this package picks the dsh-native vertical solution.
10
8
 
11
- > 文档以中文为主;深度契约在 [docs/](docs/README.md)matchers / 边界契约 / review / 报告结构 / 宿主接线 / 已知问题)。
9
+ > Documentation is Chinese-first; deep contracts live in [docs/](docs/README.md) (matchers / boundary contracts / review / report structure / host wiring / known issues).
12
10
 
13
- ## 为什么需要它
11
+ ## Why it exists
14
12
 
15
- | 类型 | 问题 | 判定 | 执行 |
13
+ | Layer | Question | Verdict | Execution |
16
14
  |---|---|---|---|
17
- | 单元/shape test | 确定性字段和值是否正确 | 自动 | plugin 自己的 `node:test` |
18
- | behavior real | 自然语言意图是否选到正确工具 | trace matcher | dsh + 真实模型 |
19
- | behavior mock | 工具管线与写入 round-trip 是否稳定 | trace matcher + workspace inspect | dsh + 脚本化 mock LLM |
20
- | comprehension review | 一个 fresh model 能否从输出理解含义和下一步 | 人工对照 rubric,多次收敛 | 抽象 review experiment + 可替换 executor |
15
+ | unit / shape test | are deterministic fields and values correct | automatic | the plugin's own `node:test` |
16
+ | behavior real | does natural-language intent pick the right tool | trace matcher | dsh + real model |
17
+ | behavior mock | is the tool pipeline and write round-trip stable | trace matcher + workspace inspect | dsh + scripted mock LLM |
18
+ | comprehension review | can a fresh model understand the output and the next step | manual rubric, converged over runs | abstract review experiment + replaceable executor |
21
19
 
22
- dsh 插件的正确性来自「装配出的图是否真的把工具、steer、prompt、gate 接到一起」——这类问题插件自己的单测只能覆盖一部分;而「输出能否被理解」根本不是字符串回归。本包把这两层从手动试跑变成可复跑证据。
20
+ A dsh plugin is correct when the assembled graph really wires tools, steers, prompts, and gates together — plugin unit tests cover only part of that, and "is the output understandable" is not a string regression at all. This package turns both layers into replayable evidence instead of manual trial runs.
23
21
 
24
22
  ```text
25
23
  plugin-owned experiment shared framework
26
24
  fixtures + prompt + rubric + observe ──► experiment/review.mjs
27
- │ task
28
-
29
- adapters/dsh/review.mjs ──► dsh headless
25
+ │ task
26
+
27
+ adapters/dsh/review.mjs ──► dsh headless
30
28
 
31
29
  behavior *.eval.mjs ───────────────────► dsh behavior runner (trace + mock)
32
30
  ```
33
31
 
34
- - `src/experiment/` 是模型与 runtime 无关的试验设计层:blind review、实时观测、多次 reviewer 字节一致证据。它不 import dsh
35
- - `src/adapters/dsh/` 是落地层:把抽象任务交给隔离的 dsh headless
36
- - 你的 `eval/` 只保留领域 fixture、projection/observe、prompt、rubric case,不复制 runner
32
+ - `src/experiment/` is the model- and runtime-agnostic experiment layer: blind review, live observation, byte-identical evidence across reviewers. It does not import dsh.
33
+ - `src/adapters/dsh/` is the landing layer: hands the abstract task to an isolated dsh headless run.
34
+ - Your `eval/` keeps only domain fixtures, projections/observe, prompts, rubrics, and cases — no runner duplication.
37
35
 
38
36
  ## Install
39
37
 
@@ -41,15 +39,15 @@ behavior *.eval.mjs ───────────────────►
41
39
  npm i -D @catheadowl/dsh-eval
42
40
  ```
43
41
 
44
- **Requirements**(接线细节与失败自诊断见 [docs/host-wiring.md](docs/host-wiring.md)):
42
+ **Requirements** (wiring details and failure self-diagnostics in [docs/host-wiring.md](docs/host-wiring.md)):
45
43
 
46
- - 一个已构建的 deepseek-harness 检出(`apps/cli/lib/bin.js`);
47
- - 被测插件已装进某个 dsh profile
48
- - peer 依赖 `@deepseek-ai/dsh-llm` 需手工接线(npm 会自动装到不兼容的古董版,须替换为指向宿主检出的链接)。
44
+ - a built deepseek-harness checkout (`apps/cli/lib/bin.js`);
45
+ - the plugin under test installed into a dsh profile;
46
+ - the peer dependency `@deepseek-ai/dsh-llm` must be wired manually (npm auto-installs an incompatible antique version; replace it with a link pointing at the host checkout).
49
47
 
50
48
  ## Quickstart
51
49
 
52
- `<plugin>/eval/behavior/mock/smoke.eval.mjs`:
50
+ `<plugin>/eval/behavior/mock/smoke.eval.mjs`:
53
51
 
54
52
  ```js
55
53
  import { firstTool, toolCalled, toolCallStep, textStep } from '@catheadowl/dsh-eval'
@@ -57,8 +55,8 @@ import { firstTool, toolCalled, toolCallStep, textStep } from '@catheadowl/dsh-e
57
55
  export default {
58
56
  id: 'my-first-case',
59
57
  mode: 'mock',
60
- task: ' guide.md 重命名为 intro.md',
61
- async prepare(workspace) { /* 播种 fixture 文件 */ },
58
+ task: 'rename guide.md to intro.md',
59
+ async prepare(workspace) { /* seed fixture files */ },
62
60
  script: { steps: [toolCallStep('md_rename', { oldPath: 'guide.md', newPath: 'intro.md' }), textStep('done')] },
63
61
  expect: [toolCalled('md_rename')],
64
62
  }
@@ -66,60 +64,66 @@ export default {
66
64
 
67
65
  ```bash
68
66
  dsh-eval run --mode mock eval/behavior/mock
69
- dsh-review --dry-run eval/comprehension # review 层的免模型预演
67
+ dsh-review --dry-run eval/comprehension # model-free dry run of the review layer
70
68
  ```
71
69
 
72
- 真实运行用 `dsh-eval run --profile <p> --repo <harness 检出> <case 路径>`;全部 flags(`--mode/--keep-artifacts/--fail-on-skip/--format/--report`)见 [docs/report.md](docs/report.md)。real case 无凭证时 auto-skip(dsh 自己解析凭证),mock dry-run 不需要任何凭证。
70
+ The command needs to know which dsh profile to use: pass `--profile <name>` explicitly, or drop a `dsh-eval.config.mjs` at the package root (see "Unified config" below).
71
+
72
+ Real runs use `dsh-eval run --profile <p> --repo <harness checkout> <case path>`; all flags (`--mode/--keep-artifacts/--fail-on-skip/--format/--report`) are documented in [docs/report.md](docs/report.md). Real cases auto-skip without credentials (dsh resolves credentials itself); mock and dry runs need no credentials.
73
73
 
74
- ## 规范目录
74
+ ## Canonical layout
75
75
 
76
76
  ```text
77
77
  <plugin>/eval/
78
- .gitignore # .runs/(无路径前缀)
78
+ .gitignore # .runs/ (no path prefix)
79
79
  README.md
80
- behavior/ # 可选
80
+ behavior/ # optional
81
81
  real/*.eval.mjs
82
82
  mock/*.eval.mjs
83
83
  _fixtures/
84
- comprehension/ # 可选
84
+ comprehension/ # optional
85
85
  <name>.review.mjs
86
86
  fixtures.json
87
87
  prompt.md
88
88
  rubric.md
89
89
  ```
90
90
 
91
- ## 统一配置 dsh-eval.config.mjs
91
+ ## Unified config dsh-eval.config.mjs
92
92
 
93
- 消费者包根放一份,两个 CLI 从工作目录向上查找,flags 永远覆盖 config
93
+ Drop one at the consumer package root; both CLIs walk upward from the working directory, and flags always override config:
94
94
 
95
95
  ```js
96
96
  export default {
97
97
  profile: 'headless', // dsh profile
98
- repo: '../../deepseek-harness', // 相对路径锚定 config 文件所在目录
99
- mode: 'mock', // behavior CLI --mode 默认(review 无此项)
100
- failOnSkip: false, // behavior CI 门禁默认
101
- report: 'eval-report.json', // --report 默认(锚定 config 目录)
102
- disableRows: ['gates'], // case 默认禁用的插件行;case 级声明覆盖
103
- // (显式 [] = 全启用,gate 交互 case 用)
98
+ repo: '../../deepseek-harness', // relative, anchored at the config file's directory
99
+ mode: 'mock', // behavior CLI's --mode default (review has none)
100
+ failOnSkip: false, // behavior CI gate default
101
+ report: 'eval-report.json', // --report default (anchored at the config dir)
102
+ disableRows: ['gates'], // plugin rows disabled by default; case-level declarations win
103
+ // (explicit [] = all enabled, for gate-interaction cases)
104
104
  }
105
105
  ```
106
106
 
107
- 未知 key 直接报错(拼写错误不静默退化)。`disableRows` 的语义与 turn-close 门禁边界契约见 [docs/disablerows.md](docs/disablerows.md)
107
+ Unknown keys fail loudly (typos never degrade silently). The `disableRows` semantics and the turn-close gate boundary contract are in [docs/disablerows.md](docs/disablerows.md).
108
108
 
109
109
  ## Docs
110
110
 
111
- | 文档 | 主题 |
111
+ | Doc | Topic |
112
112
  |---|---|
113
- | [host-wiring](docs/host-wiring.md) | peer 接线(含 npm 古董 peer 坑)、构建 CLI、profile、凭证、spawn 要求 |
114
- | [review](docs/review.md) | comprehension review:实验定义、sterile profile、产物、六条固化规则 |
115
- | [matchers](docs/matchers.md) | trace matcher mock helper 全集(工具面 / 文本面 / 模型可见面) |
116
- | [disablerows](docs/disablerows.md) | `disableRows` turn-close 门禁边界契约 |
117
- | [intent-cases](docs/intent-cases.md) | real 意图 case 规约:何时写、断言面、守卫、CI 语义 |
118
- | [report](docs/report.md) | 机器可读报告(`--format json` / `--report`)结构 |
119
- | [known-issues](docs/known-issues.md) | 已知问题与规避(如 staged home REQUEST_EXTENSION) |
120
-
121
- ## 运行保障
122
-
123
- runner 用 `try/finally` 保证临时目录与链接在任何路径(`prepare` 抛错、mock 校验失败、spawn 错误)都被清理,不污染真实 profile store。behavior 与 review CLI 共享目录扫描(跳过 `.runs` `node_modules`);behavior CLI 在加载期做 case shape 校验与跨文件重复 id 检测,尽早失败。
124
-
125
- License: MIT。框架自身的测试与发布自检由仓库 CI 承接,不随包发布。
113
+ | [host-wiring](docs/host-wiring.md) | peer wiring (incl. the npm antique-peer trap), building the CLI, profiles, credentials, spawn requirements |
114
+ | [review](docs/review.md) | comprehension review: experiment definition, blank-environment reviewers, artifacts, the six review rules |
115
+ | [matchers](docs/matchers.md) | the full trace-matcher and mock-helper set (tool face / text face / model-visible face) |
116
+ | [disablerows](docs/disablerows.md) | `disableRows` and the turn-close gate boundary contract |
117
+ | [rowconfig](docs/rowconfig.md) | the `rowConfig` per-row config override contract (whole-segment replacement, restate needed keys) |
118
+ | [cross-turn](docs/cross-turn.md) | the `followups` cross-turn async driving contract (driver-row swap, subagent settle wait, single-cursor mock orchestration, bounded-redispatch assertions) |
119
+ | [intent-cases](docs/intent-cases.md) | real intent-case spec: when to write one, assertion face, guards, CI semantics |
120
+ | [report](docs/report.md) | machine-readable report structure (`--format json` / `--report`) |
121
+ | [known-issues](docs/known-issues.md) | known issues and workarounds (e.g. REQUEST_EXTENSION in staged homes) |
122
+ | [runner-api](docs/runner-api.md) | programmatic runner API: `runEvalCase` options contract, EvalRunResult fields, crossing tiers for `cliPath` |
123
+ | [experimental](docs/experimental.md) | `experimental` subpath symbol list (escape hatch, no compatibility promise) |
124
+
125
+ ## Runtime guarantees
126
+
127
+ The runner uses `try/finally` so temp directories and links are cleaned up on every path (`prepare` throwing, mock validation failure, spawn errors) — the real profile store is never polluted. The behavior and review CLIs share directory scanning (skipping `.runs` and `node_modules`); the behavior CLI validates case shapes and detects cross-file duplicate ids at load time, failing as early as possible.
128
+
129
+ License: MIT. The framework's own tests and release self-checks are carried by the repository CI and do not ship with the package.
package/README.zh.md ADDED
@@ -0,0 +1,129 @@
1
+ # @catheadowl/dsh-eval
2
+
3
+ [English](README.md) | 中文
4
+
5
+ **面向插件作者的 dsh-native agent 评测层**:behavior case 跑真实 headless dsh trace,review experiment 测 fresh model 能否理解插件输出。
6
+
7
+ 它评测的是**装配后的 agent harness**(插件 + profile + patch + 工具注册表在真实 dsh headless 里接成的那张图),不是孤立函数;判定走 dsh 原生的 session trace 投影与 matcher(契约断言),不是 metric 分数。它不是通用 agent eval 平台(无 dashboard / dataset hosting / metric catalog,也不做 benchmark 排名),也不是 DeepEval / OpenAI Evals 的替代品——那些项目证明了这个问题空间成立,本包选择 dsh-native 的垂直解法。
8
+
9
+ > 文档以中文为主;深度契约在 [docs/](docs/README.md)(matchers / 边界契约 / review / 报告结构 / 宿主接线 / 已知问题)。
10
+
11
+ ## 为什么需要它
12
+
13
+ | 类型 | 问题 | 判定 | 执行 |
14
+ |---|---|---|---|
15
+ | 单元/shape test | 确定性字段和值是否正确 | 自动 | plugin 自己的 `node:test` |
16
+ | behavior real | 自然语言意图是否选到正确工具 | trace matcher | dsh + 真实模型 |
17
+ | behavior mock | 工具管线与写入 round-trip 是否稳定 | trace matcher + workspace inspect | dsh + 脚本化 mock LLM |
18
+ | comprehension review | 一个 fresh model 能否从输出理解含义和下一步 | 人工对照 rubric,多次收敛 | 抽象 review experiment + 可替换 executor |
19
+
20
+ dsh 插件的正确性来自「装配出的图是否真的把工具、steer、prompt、gate 接到一起」——这类问题插件自己的单测只能覆盖一部分;而「输出能否被理解」根本不是字符串回归。本包把这两层从手动试跑变成可复跑证据。
21
+
22
+ ```text
23
+ plugin-owned experiment shared framework
24
+ fixtures + prompt + rubric + observe ──► experiment/review.mjs
25
+ │ task
26
+
27
+ adapters/dsh/review.mjs ──► dsh headless
28
+
29
+ behavior *.eval.mjs ───────────────────► dsh behavior runner (trace + mock)
30
+ ```
31
+
32
+ - `src/experiment/` 是模型与 runtime 无关的试验设计层:blind review、实时观测、多次 reviewer 字节一致证据。它不 import dsh。
33
+ - `src/adapters/dsh/` 是落地层:把抽象任务交给隔离的 dsh headless。
34
+ - 你的 `eval/` 只保留领域 fixture、projection/observe、prompt、rubric 与 case,不复制 runner。
35
+
36
+ ## Install
37
+
38
+ ```bash
39
+ npm i -D @catheadowl/dsh-eval
40
+ ```
41
+
42
+ **Requirements**(接线细节与失败自诊断见 [docs/host-wiring.md](docs/host-wiring.md)):
43
+
44
+ - 一个已构建的 deepseek-harness 检出(`apps/cli/lib/bin.js`);
45
+ - 被测插件已装进某个 dsh profile;
46
+ - peer 依赖 `@deepseek-ai/dsh-llm` 需手工接线(npm 会自动装到不兼容的古董版,须替换为指向宿主检出的链接)。
47
+
48
+ ## Quickstart
49
+
50
+ `<plugin>/eval/behavior/mock/smoke.eval.mjs`:
51
+
52
+ ```js
53
+ import { firstTool, toolCalled, toolCallStep, textStep } from '@catheadowl/dsh-eval'
54
+
55
+ export default {
56
+ id: 'my-first-case',
57
+ mode: 'mock',
58
+ task: '把 guide.md 重命名为 intro.md',
59
+ async prepare(workspace) { /* 播种 fixture 文件 */ },
60
+ script: { steps: [toolCallStep('md_rename', { oldPath: 'guide.md', newPath: 'intro.md' }), textStep('done')] },
61
+ expect: [toolCalled('md_rename')],
62
+ }
63
+ ```
64
+
65
+ ```bash
66
+ dsh-eval run --mode mock eval/behavior/mock
67
+ dsh-review --dry-run eval/comprehension # review 层的免模型预演
68
+ ```
69
+
70
+ 命令需要知道用哪个 dsh profile:显式传 `--profile <name>`,或放一份 `dsh-eval.config.mjs` 到包根(见下节「统一配置」)。
71
+
72
+ 真实运行用 `dsh-eval run --profile <p> --repo <harness 检出> <case 路径>`;全部 flags(`--mode/--keep-artifacts/--fail-on-skip/--format/--report`)见 [docs/report.md](docs/report.md)。real case 无凭证时 auto-skip(dsh 自己解析凭证),mock 与 dry-run 不需要任何凭证。
73
+
74
+ ## 规范目录
75
+
76
+ ```text
77
+ <plugin>/eval/
78
+ .gitignore # .runs/(无路径前缀)
79
+ README.md
80
+ behavior/ # 可选
81
+ real/*.eval.mjs
82
+ mock/*.eval.mjs
83
+ _fixtures/
84
+ comprehension/ # 可选
85
+ <name>.review.mjs
86
+ fixtures.json
87
+ prompt.md
88
+ rubric.md
89
+ ```
90
+
91
+ ## 统一配置 dsh-eval.config.mjs
92
+
93
+ 消费者包根放一份,两个 CLI 从工作目录向上查找,flags 永远覆盖 config:
94
+
95
+ ```js
96
+ export default {
97
+ profile: 'headless', // dsh profile
98
+ repo: '../../deepseek-harness', // 相对路径锚定 config 文件所在目录
99
+ mode: 'mock', // behavior CLI 的 --mode 默认(review 无此项)
100
+ failOnSkip: false, // behavior CI 门禁默认
101
+ report: 'eval-report.json', // --report 默认(锚定 config 目录)
102
+ disableRows: ['gates'], // case 默认禁用的插件行;case 级声明覆盖
103
+ // (显式 [] = 全启用,gate 交互 case 用)
104
+ }
105
+ ```
106
+
107
+ 未知 key 直接报错(拼写错误不静默退化)。`disableRows` 的语义与 turn-close 门禁边界契约见 [docs/disablerows.md](docs/disablerows.md)。
108
+
109
+ ## Docs
110
+
111
+ | 文档 | 主题 |
112
+ |---|---|
113
+ | [host-wiring](docs/host-wiring.md) | peer 接线(含 npm 古董 peer 坑)、构建 CLI、profile、凭证、spawn 要求 |
114
+ | [review](docs/review.md) | comprehension review:实验定义、空白环境 reviewer、产物、六条评审规则 |
115
+ | [matchers](docs/matchers.md) | trace matcher 与 mock helper 全集(工具面 / 文本面 / 模型可见面) |
116
+ | [disablerows](docs/disablerows.md) | `disableRows` 与 turn-close 门禁边界契约 |
117
+ | [rowconfig](docs/rowconfig.md) | `rowConfig` 行 config 覆写契约(整段替换、重述所需键) |
118
+ | [cross-turn](docs/cross-turn.md) | `followups` 跨轮异步驱动契约(driver 行换装、子 agent settle 等待、mock 单 cursor 编排、有界重派断言) |
119
+ | [intent-cases](docs/intent-cases.md) | real 意图 case 规约:何时写、断言面、守卫、CI 语义 |
120
+ | [report](docs/report.md) | 机器可读报告(`--format json` / `--report`)结构 |
121
+ | [known-issues](docs/known-issues.md) | 已知问题与规避(如 staged home 的 REQUEST_EXTENSION) |
122
+ | [runner-api](docs/runner-api.md) | 程序化 runner API:`runEvalCase` options 契约、EvalRunResult 字段、跨档取 `cliPath` |
123
+ | [experimental](docs/experimental.md) | `experimental` 子路径符号清单(逃生面,无兼容承诺) |
124
+
125
+ ## 运行保障
126
+
127
+ runner 用 `try/finally` 保证临时目录与链接在任何路径(`prepare` 抛错、mock 校验失败、spawn 错误)都被清理,不污染真实 profile store。behavior 与 review CLI 共享目录扫描(跳过 `.runs` 与 `node_modules`);behavior CLI 在加载期做 case shape 校验与跨文件重复 id 检测,尽早失败。
128
+
129
+ License: MIT。框架自身的测试与发布自检由仓库 CI 承接,不随包发布。