@catheadowl/dsh-eval 0.2.0 → 0.3.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/CHANGELOG.md ADDED
@@ -0,0 +1,129 @@
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.3.0] — 2026-09-13
12
+
13
+ ### Added
14
+
15
+ - **Projection census** on every case that produced a session trace:
16
+ `census.eventTypeCounts` (the main session log's events per type),
17
+ `census.projectionLengths` (the five projection lengths) with
18
+ `census.projectionSkipped` naming where a count exceeds its projection length,
19
+ `census.projectionFieldGaps` naming the events that projected while a field
20
+ they carry went missing (the `tool/call` / `tool/result` / `request/header`
21
+ projections are 1:1, so a moved field never shows up as a length difference),
22
+ and `census.subagent` (the child logs behind `subagentChildren`: their
23
+ `subagent/descriptor` event counts, how many carry the supported descriptor
24
+ version, and the folded identity). The census reports numbers only and never
25
+ decides whether a difference is a defect — it makes "the host log carried no
26
+ such event" and "the projection dropped it" separable in `--format json` and
27
+ in `.runs/<id>/trace.json`. Cases with no trace carry no census.
28
+ - Session-seam boundary assertions: `collectSessionTrace` reports which
29
+ candidate artifact files were actually present when no session trace
30
+ materializes (behavior failures name the host artifact naming instead of a
31
+ bare "no session trace materialized"), and `parseSessionLog` refuses a
32
+ `header.version` outside `KNOWN_SESSION_FORMAT_VERSIONS` with the version
33
+ number instead of projecting empty fields. `EvalRunResult.traceGap` carries
34
+ the diagnosis to the CLI failure text.
35
+
36
+ ### Removed
37
+
38
+ - `loadTraceDir` (experimental): replaced by `collectSessionTrace`, which
39
+ returns the trace together with the reason none was built. Migrate
40
+ `loadTraceDir(root)` to `collectSessionTrace(root).trace`.
41
+ - **`options.dshRepoDir`** on `runEvalCase` (and the same legacy option on
42
+ the review executor and `executeBehaviorExperiment`): the CLI location is
43
+ now `options.cliPath` only. **Migrating a case that trips this**: resolve
44
+ once with `resolveDshCliChain` (the `/experimental` export) and pass its
45
+ `cli` result as `cliPath` — the `dsh-eval` / `dsh-review` CLIs already do
46
+ this via `--repo`, the `node_modules` resolution layer, or the config
47
+ `repo` key.
48
+
49
+ ### Fixed
50
+
51
+ - **Mock mode against host 0.1.5-rc.2: the scripted adapter now carries its
52
+ own `prepareCall`.** The host's LLM service dispatches every model call
53
+ through `registration.adapter.prepareCall(...)`, a wire-contract step the
54
+ adapter's inherited base class did not have — the base resolves from this
55
+ package's `@deepseek-ai/dsh-llm` peer instance, which lagged the host
56
+ runtime (0.0.1-rc.1 vs 0.1.5-rc.2), so every mock run died at startup with
57
+ `registration.adapter.prepareCall is not a function`. The override mirrors
58
+ the host base-class default (`{ model, stream }` bound to one adapter
59
+ generation), making the wire contract independent of the peer instance's
60
+ generation; the seam is now documented in `docs/host-wiring.md` with a
61
+ maintenance trigger.
62
+ - `census.eventTypeCounts` counts prototype-named event types correctly: a
63
+ plug-in event type such as `constructor` or `__proto__` used to produce a
64
+ string-concatenated value or vanish from the map entirely, so a field named
65
+ like a count could hold a non-number.
66
+ - Session-trace discovery follows the host's **format-generation artifact
67
+ names**: `session.jsonl` for v0 and `session.vN.jsonl` for later
68
+ generations (`session.v3.jsonl` on the current host). Matching only the v0
69
+ name made every behavior case fail with "no session trace materialized"
70
+ after the host bumped the session format.
71
+ - The multi-turn driver reads the durable log through
72
+ `Session#snapshotEvents()`; the `session.events` getter it used was removed
73
+ upstream, so any case declaring `followups` aborted the headless run with
74
+ `agent.session.events is not iterable`.
75
+ - Review runs no longer fail open when no session artifact materializes:
76
+ `validateToolBoundary` reports `status: 'not-executed'` (not a pass), the
77
+ executor result carries the gap, the report states
78
+ `tool boundary: NOT EXECUTED on run(s) N`, and both `run-N.txt` and
79
+ `run.json` record it — a review whose tool face was never verified no longer
80
+ reads as a normal one.
81
+
82
+ ## [0.2.1] — 2026-09-09
83
+
84
+ ### Added
85
+
86
+ - Subagent dispatch observability: `subagentChildren` projection plus
87
+ `subagentDispatched` / `subagentCompleted` matchers.
88
+ - Multi-turn followups: cross-turn asynchronous driving for review
89
+ experiments, with dispatch/completion count assertions.
90
+
91
+ ### Changed
92
+
93
+ - `dsh-review` boots a **blank environment by default**: staged out-of-tree
94
+ plugin rows are disabled via overlay, so host-profile gates/plugins can no
95
+ longer steer or crash a reviewer. Pass `--keep-plugin-rows` (or executor
96
+ option `keepPluginRows`) to opt back in deliberately.
97
+
98
+ ### Fixed
99
+
100
+ - Review artifacts capture the reviewer's **answer**, not the last message:
101
+ conclusions use the last assistant text before any plugin-sourced injection
102
+ (trace-derived); the raw final message is kept as `run-N.stdout.txt` when it
103
+ diverges, and each report run cites its transcript.
104
+
105
+ ## [0.2.0] — 2026-09-06
106
+
107
+ ### Changed
108
+
109
+ - **BREAKING (0.x minor)**: public API split into two tiers. The root entry
110
+ is now the SDK tier only (assertion DSL, step builders, `runEvalCase`,
111
+ `defineReviewExperiment`); low-level sandbox/overlay/trace primitives and
112
+ review execution moved to the `./experimental` escape-hatch subpath.
113
+ - `exports` map added — deep path imports are now mechanically blocked.
114
+
115
+ ## [0.1.0] — 2026-09-05
116
+
117
+ ### Added
118
+
119
+ - Initial public release: case runner over dsh headless runs,
120
+ session-trace assertions, and a scripted mock-LLM layer for plugin intent
121
+ tests.
122
+ - CLI binaries `dsh-eval` (run cases) and `dsh-review` (LLM output review);
123
+ `@deepseek-ai/dsh-llm` is a peerDependency provided by the host
124
+ ecosystem.
125
+
126
+ [0.3.0]: https://github.com/CatheadOwl/dsh-eval/releases/tag/v0.3.0
127
+ [0.2.1]: https://github.com/CatheadOwl/dsh-eval/releases/tag/v0.2.1
128
+ [0.2.0]: https://github.com/CatheadOwl/dsh-eval/releases/tag/v0.2.0
129
+ [0.1.0]: https://github.com/CatheadOwl/dsh-eval/releases/tag/v0.1.0
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority; after
3
3
  # editing either side, bring the other along and re-record with:
4
4
  # node scripts/verify-readme-i18n.mjs --write
5
- README.md: 063d8659bc607bbefcc4a09aefa3c5b9280628ae249e150e41952a6b9f83239e
6
- README.zh.md: 4938e021edcf5fb49232c96b780ed121d51e00abe4a89b3583a17ecbbb2f14b1
5
+ README.md: 94e4e6c1172544c94c65329abf8dc6db81c0ba8030c354e1c1e8e64f8bc8276b
6
+ README.zh.md: a1f45726e695fe46931a2988c7293d53c61b3c275dc92e039e707b315f72fc60
package/README.md CHANGED
@@ -1,7 +1,3 @@
1
- ---
2
- description: '@catheadowl/dsh-eval — a dsh-native agent evaluation layer for plugin authors: behavior cases run against real headless dsh traces, review experiments test whether fresh models understand plugin outputs'
3
- ---
4
-
5
1
  # @catheadowl/dsh-eval
6
2
 
7
3
  English | [中文](README.zh.md)
@@ -115,10 +111,11 @@ Unknown keys fail loudly (typos never degrade silently). The `disableRows` seman
115
111
  | Doc | Topic |
116
112
  |---|---|
117
113
  | [host-wiring](docs/host-wiring.md) | peer wiring (incl. the npm antique-peer trap), building the CLI, profiles, credentials, spawn requirements |
118
- | [review](docs/review.md) | comprehension review: experiment definition, sterile profile, artifacts, the six review rules |
114
+ | [review](docs/review.md) | comprehension review: experiment definition, blank-environment reviewers, artifacts, the six review rules |
119
115
  | [matchers](docs/matchers.md) | the full trace-matcher and mock-helper set (tool face / text face / model-visible face) |
120
116
  | [disablerows](docs/disablerows.md) | `disableRows` and the turn-close gate boundary contract |
121
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) |
122
119
  | [intent-cases](docs/intent-cases.md) | real intent-case spec: when to write one, assertion face, guards, CI semantics |
123
120
  | [report](docs/report.md) | machine-readable report structure (`--format json` / `--report`) |
124
121
  | [known-issues](docs/known-issues.md) | known issues and workarounds (e.g. REQUEST_EXTENSION in staged homes) |
package/README.zh.md CHANGED
@@ -1,7 +1,3 @@
1
- ---
2
- description: '@catheadowl/dsh-eval 中文主页——dsh-native agent 评测层:behavior case 跑真实 headless dsh trace,review experiment 测 fresh model 能否理解插件输出'
3
- ---
4
-
5
1
  # @catheadowl/dsh-eval
6
2
 
7
3
  [English](README.md) | 中文
@@ -115,10 +111,11 @@ export default {
115
111
  | 文档 | 主题 |
116
112
  |---|---|
117
113
  | [host-wiring](docs/host-wiring.md) | peer 接线(含 npm 古董 peer 坑)、构建 CLI、profile、凭证、spawn 要求 |
118
- | [review](docs/review.md) | comprehension review:实验定义、sterile profile、产物、六条评审规则 |
114
+ | [review](docs/review.md) | comprehension review:实验定义、空白环境 reviewer、产物、六条评审规则 |
119
115
  | [matchers](docs/matchers.md) | trace matcher 与 mock helper 全集(工具面 / 文本面 / 模型可见面) |
120
116
  | [disablerows](docs/disablerows.md) | `disableRows` 与 turn-close 门禁边界契约 |
121
117
  | [rowconfig](docs/rowconfig.md) | `rowConfig` 行 config 覆写契约(整段替换、重述所需键) |
118
+ | [cross-turn](docs/cross-turn.md) | `followups` 跨轮异步驱动契约(driver 行换装、子 agent settle 等待、mock 单 cursor 编排、有界重派断言) |
122
119
  | [intent-cases](docs/intent-cases.md) | real 意图 case 规约:何时写、断言面、守卫、CI 语义 |
123
120
  | [report](docs/report.md) | 机器可读报告(`--format json` / `--report`)结构 |
124
121
  | [known-issues](docs/known-issues.md) | 已知问题与规避(如 staged home 的 REQUEST_EXTENSION) |