dsh-session-eval 0.2.1 → 0.2.3

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 CHANGED
@@ -1,5 +1,27 @@
1
+ ## 0.2.3 — 2026-10-03
2
+
3
+ Docs polish round (no runtime changes).
4
+
5
+ - Install detail completed: requirements, GitHub install route, the `cordis.patch.yml` row.
6
+ - Contributor block links the open-gap issues directly; sample outputs aligned with the shipped version.
7
+ - Community section; bilingual issue templates (`.github/ISSUE_TEMPLATE/`).
8
+ - English/Chinese README sections kept in sync.
9
+
1
10
  # Changelog
2
11
 
12
+ ## 0.2.2 — 2026-10-02
13
+
14
+ Contributor-first docs release.
15
+
16
+ - Install command fixed to `dsh plugin --profile web add dsh-session-eval` (a global npm install does not mount the slash commands).
17
+ - README.zh.md language switch fixed (English link restored, toggle on top); sample outputs bumped to the shipped version.
18
+ - Skeleton: one-liner → install → try-once → toolchain table → 6-line contributor block.
19
+ - CONTRIBUTING.md (with source map), SECURITY.md, CODE_OF_CONDUCT.md added; GitHub topics set.
20
+ - Docs no longer hardcode test counts.
21
+ - Install details (GitHub route + `cordis.patch.yml`), Development/Community footers, and issue links #1–#3 added for parity with the sibling plugins.
22
+ - GitHub issue templates (`bug_report`, `feature_request`) added.
23
+
24
+
3
25
  ## 0.2.1 — 2026-09-26
4
26
 
5
27
  - **Fix: ship the bundle overlay.** v0.2.0 declared `dsh.bundle.patch: ./cordis.patch.yml`
package/README.md CHANGED
@@ -11,41 +11,38 @@ English | [中文](README.zh.md)
11
11
 
12
12
  No benchmark suites to author. No LLM judges. No new runs. Every grade is a fixed, documented threshold over persisted session logs — fully reproducible.
13
13
 
14
- ## The measurement layer of the session toolchain
15
-
16
- | Plugin | Layer | Answers |
17
- |---|---|---|
18
- | [`dsh-session-export`](https://www.npmjs.com/package/dsh-session-export) | Evidence | "What exactly happened in this session?" |
19
- | [`dsh-session-recall`](https://www.npmjs.com/package/dsh-session-recall) | Memory | "What did I do before, and where is it?" |
20
- | **`dsh-session-eval`** | **Measurement** | **"Was that session good? Is the trend improving?"** |
14
+ ## Install
21
15
 
22
- All three read through the same trusted `ctx.sessionQuery` seam, so any persistence backend (JSONL or SQLite) works without touching raw artifacts.
16
+ **Requirements**: Node.js 20 or 22 · a DeepSeek Harness profile that mounts the `commands` and `sessionQuery` services (the shipped `web` / `agent` profiles qualify).
23
17
 
24
- ## How it differs from benchmark-style evaluation
18
+ ```bash
19
+ dsh plugin --profile web add dsh-session-eval
20
+ ```
25
21
 
26
- | | `dsh-eval` (benchmark) | `dsh-session-eval` (this) |
27
- |---|---|---|
28
- | Evaluates | Runs you launch ahead of time | Sessions that already happened |
29
- | Setup | Author benchmark YAML + cases | None — read existing logs |
30
- | Judge | Metric folding over trials | Fixed thresholds, deterministic |
31
- | Best at | Pre-deploy benchmarks | Regression tracking over real work |
22
+ Or from GitHub:
32
23
 
33
- Both are useful; they don't compete. Benchmarks test what you *predicted*; retrospective evaluation watches what *actually happened*.
24
+ ```bash
25
+ dsh plugin --profile web add github:kittimzhe/dsh-session-eval
26
+ ```
34
27
 
35
- ## Quick Start
28
+ The bundle overlay mounts `/eval`, `/eval-diff`, and `/eval-history`. If you maintain your own `cordis.patch.yml`, keep this row:
36
29
 
37
- ```bash
38
- npm install -g dsh-session-eval
30
+ ```yaml
31
+ - insert:
32
+ - id: session-eval
33
+ name: 'dsh-session-eval'
39
34
  ```
40
35
 
41
- Then in DeepSeek Harness:
36
+ ## Try it once
37
+
38
+ In DeepSeek Harness:
42
39
 
43
40
  ```text
44
41
  /eval
45
42
  ```
46
43
 
47
44
  ```text
48
- Session eval — a1b2c3d4… (dsh-session-eval v0.2.0)
45
+ Session eval — a1b2c3d4… (dsh-session-eval v0.2.2)
49
46
  Overall: A
50
47
  Reliability A 2/87 tool results errored (2.3%)
51
48
  Re-ask A 1 re-ask signal(s) over 23 turns (0.4/10 turns)
@@ -54,45 +51,50 @@ Notes:
54
51
  • Wall time 41.2 min over 23 turns.
55
52
  ```
56
53
 
57
- Grade another session, or emit machine-readable JSON:
54
+ ## The measurement layer of the session toolchain
58
55
 
59
- ```text
60
- /eval --id <sessionId> --json
61
- ```
56
+ | Plugin | Layer | Answers |
57
+ |---|---|---|
58
+ | [`dsh-session-export`](https://www.npmjs.com/package/dsh-session-export) | Evidence | "What exactly happened in this session?" |
59
+ | [`dsh-session-recall`](https://www.npmjs.com/package/dsh-session-recall) | Memory | "What did I do before, and where is it?" |
60
+ | **`dsh-session-eval`** | **Measurement** | **"Was that session good? Is the trend improving?"** |
62
61
 
63
- Compare two sessions — the regression workflow:
62
+ All three read through the same trusted `ctx.sessionQuery` seam, so any persistence backend (JSONL or SQLite) works without touching raw artifacts.
64
63
 
65
- ```text
66
- /eval-diff <beforeSessionId> <afterSessionId>
67
- ```
64
+ ## Contributing
68
65
 
69
- ```text
70
- Session diff — a1b2c3d4… → e5f6a7b8… (dsh-session-eval v0.2.0)
71
- Overall: regressed — 0 improved, 2 regressed, 1 flat.
72
- Reliability 2.1% → 11.8% regressed
73
- Re-ask 0.5 → 3.2 regressed
74
- Tool load 3.8 → 4.1 flat
75
- ```
66
+ - **Local dev**: `npm ci && npm run typecheck && npm test && npm run bundle` (Node 20 or 22).
67
+ - **Start in the source**: [`src/grade.ts`](src/grade.ts) (thresholds, grade cards), [`src/metrics.ts`](src/metrics.ts) (metric extraction), [`src/trend.ts`](src/trend.ts) (`/eval-history` trend logic). See [CONTRIBUTING.md](CONTRIBUTING.md) for the source map and first-PR suggestions.
68
+ - **Open gaps**: [#1](https://github.com/kittimzhe/dsh-session-eval/issues/1) (configurable thresholds), [#2](https://github.com/kittimzhe/dsh-session-eval/issues/2) (`/eval-history --since`), [#3](https://github.com/kittimzhe/dsh-session-eval/issues/3) (`/eval-history --out`) — or browse [issues labeled `good first issue`](https://github.com/kittimzhe/dsh-session-eval/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22).
69
+ - **Rules**: behavior changes need tests; doc changes must update `README.md` and `README.zh.md` in sync; version releases belong to the maintainer. Details: [CONTRIBUTING.md](CONTRIBUTING.md).
76
70
 
77
- Typical use: grade the ten sessions before and after a plugin or prompt change; a persistent `Reliability` regression is an early warning that the change hurt real work, not just benchmarks.
71
+ ## How it differs from benchmark-style evaluation
78
72
 
79
- See the whole trend — no ids to hunt for:
73
+ | | `dsh-eval` (benchmark) | `dsh-session-eval` (this) |
74
+ |---|---|---|
75
+ | Evaluates | Runs you launch ahead of time | Sessions that already happened |
76
+ | Setup | Author benchmark YAML + cases | None — read existing logs |
77
+ | Judge | Metric folding over trials | Fixed thresholds, deterministic |
78
+ | Best at | Pre-deploy benchmarks | Regression tracking over real work |
80
79
 
81
- ```text
82
- /eval-history # last 5 sessions in this workspace
83
- /eval-history 12 # last 12
84
- ```
80
+ Both are useful; they don't compete. Benchmarks test what you *predicted*; retrospective evaluation watches what *actually happened*.
85
81
 
86
- ```text
87
- Session history — last 5 in this workspace
88
- 2026-09-20 14:02 a1b2c3d4… B 4 turns, 9 tools
89
- 2026-09-21 09:15 c3d4e5f6… A 5 turns, 11 tools
90
- 2026-09-22 17:44 e5f6a7b8… A 3 turns, 7 tools
91
- Trend (first → last): improved — 2 improved, 0 regressed, 1 flat.
92
- ```
82
+ ## Commands
83
+
84
+ | Command | Effect |
85
+ |---|---|
86
+ | `/eval` | Grade card for the current session |
87
+ | `/eval --id <sessionId>` | Grade a specific session |
88
+ | `/eval --json` | Machine-readable metrics + card |
89
+ | `/eval-diff <beforeId> <afterId>` | Regression comparison, noise-tolerant |
90
+ | `/eval-diff … --json` | Machine-readable trend report |
91
+ | `/eval-history [N]` | Grade the last N sessions in this workspace and show the trend |
92
+ | `/eval-history … --json` | Machine-readable history report |
93
93
 
94
94
  `/eval-history` finds the sessions for you via the same `sessionQuery` seam `/archive` uses (scoped to the current workspace's `cwd`), grades each, and diffs the first against the last. `/eval-diff` remains the tool when you already know the two ids that matter.
95
95
 
96
+ Typical use: grade the ten sessions before and after a plugin or prompt change; a persistent `Reliability` regression is an early warning that the change hurt real work, not just benchmarks.
97
+
96
98
  ## Dimensions & thresholds
97
99
 
98
100
  All grades derive from three deterministic metrics. `n/a` when the session lacks the relevant activity.
@@ -105,7 +107,7 @@ All grades derive from three deterministic metrics. `n/a` when the session lacks
105
107
 
106
108
  ¹ A *correction signal* is each extra user message inside a consecutive-user run — the human re-asking before any assistant reply, a behavioral proxy for "the agent didn't get it right the first time."
107
109
 
108
- `Overall` is the **worst** graded dimension — conservative by design. Thresholds are constants in [`src/grade.ts`](src/grade.ts); they will be configurable in a future release.
110
+ `Overall` is the **worst** graded dimension — conservative by design. Thresholds are constants in [`src/grade.ts`](src/grade.ts); making them configurable is on the roadmap (see issues).
109
111
 
110
112
  Diff verdicts include a noise band (±2pp error rate, ±0.5 re-ask, ±1 tool load) so trivial jitter doesn't cry regression.
111
113
 
@@ -113,27 +115,19 @@ Diff verdicts include a noise band (±2pp error rate, ±0.5 re-ask, ±1 tool loa
113
115
 
114
116
  Same session logs in → same grade card out, every time, forever. There is no model in the loop, no sampling, no clock dependence in the metrics (wall time is reported, never graded). This is what makes `/eval-diff` trustworthy as a regression signal.
115
117
 
116
- ## Commands
117
-
118
- | Command | Effect |
119
- |---|---|
120
- | `/eval` | Grade card for the current session |
121
- | `/eval --id <sessionId>` | Grade a specific session |
122
- | `/eval --json` | Machine-readable metrics + card |
123
- | `/eval-diff <beforeId> <afterId>` | Regression comparison, noise-tolerant |
124
- | `/eval-diff … --json` | Machine-readable trend report |
125
- | `/eval-history [N]` | Grade the last N sessions in this workspace and show the trend |
126
- | `/eval-history … --json` | Machine-readable history report |
127
-
128
118
  ## Development
129
119
 
130
120
  ```bash
131
- npm install
121
+ npm ci
132
122
  npm run typecheck # tsc --noEmit
133
- npm test # vitest run — 24 tests
123
+ npm test # vitest run
134
124
  npm run bundle # tsdown → lib/
135
125
  ```
136
126
 
137
127
  ## License
138
128
 
139
129
  [MIT](LICENSE)
130
+
131
+ ## Community
132
+
133
+ - [Contributing](CONTRIBUTING.md) · [Security policy](SECURITY.md) · [Code of Conduct](CODE_OF_CONDUCT.md)
package/README.zh.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # dsh-session-eval
2
2
 
3
+ [English](README.md) | 中文
4
+
3
5
  [![npm](https://img.shields.io/npm/v/dsh-session-eval)](https://www.npmjs.com/package/dsh-session-eval)
6
+ [![npm downloads](https://img.shields.io/npm/dw/dsh-session-eval)](https://www.npmjs.com/package/dsh-session-eval)
4
7
  [![tests](https://github.com/kittimzhe/dsh-session-eval/actions/workflows/test.yml/badge.svg)](https://github.com/kittimzhe/dsh-session-eval/actions/workflows/test.yml)
5
8
  [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
9
 
@@ -8,40 +11,89 @@
8
11
 
9
12
  不需要编写基准测试集,没有 LLM 裁判,不需要跑新任务。所有等级 = 持久化会话日志上的固定公开阈值——完全可复现。
10
13
 
11
- English | [中文](README.zh.md)
14
+ ## 安装
15
+
16
+ **环境要求**:Node.js 20 或 22 · 挂载了 `commands` 与 `sessionQuery` 服务的 DeepSeek Harness profile(官方 `web` / `agent` profile 均满足)。
17
+
18
+ ```bash
19
+ dsh plugin --profile web add dsh-session-eval
20
+ ```
21
+
22
+ 或从 GitHub:
23
+
24
+ ```bash
25
+ dsh plugin --profile web add github:kittimzhe/dsh-session-eval
26
+ ```
27
+
28
+ bundle 覆盖层会挂上 `/eval`、`/eval-diff`、`/eval-history`。若你维护自己的 `cordis.patch.yml`,请保留这一行:
29
+
30
+ ```yaml
31
+ - insert:
32
+ - id: session-eval
33
+ name: 'dsh-session-eval'
34
+ ```
35
+
36
+ ## 试一次
37
+
38
+ 在 DeepSeek Harness 里:
39
+
40
+ ```text
41
+ /eval
42
+ ```
43
+
44
+ ```text
45
+ Session eval — a1b2c3d4… (dsh-session-eval v0.2.2)
46
+ Overall: A
47
+ Reliability A 2/87 tool results errored (2.3%)
48
+ Re-ask A 1 re-ask signal(s) over 23 turns (0.4/10 turns)
49
+ Tool load B 3.8 tool calls per turn
50
+ Notes:
51
+ • Wall time 41.2 min over 23 turns.
52
+ ```
12
53
 
13
54
  ## 会话工具链的评测层
14
55
 
15
56
  | 插件 | 层 | 回答的问题 |
16
57
  |---|---|---|
17
- | `dsh-session-export` | 证据层 | "这个会话到底发生了什么?" |
18
- | `dsh-session-recall` | 记忆层 | "我以前做过什么,在哪?" |
58
+ | [`dsh-session-export`](https://www.npmjs.com/package/dsh-session-export) | 证据层 | "这个会话到底发生了什么?" |
59
+ | [`dsh-session-recall`](https://www.npmjs.com/package/dsh-session-recall) | 记忆层 | "我以前做过什么,在哪?" |
19
60
  | **`dsh-session-eval`** | **评测层** | **"刚才的会话好不好?趋势在变好吗?"** |
20
61
 
21
62
  三者都通过同一个可信的 `ctx.sessionQuery` 缝读取,JSONL / SQLite 等任何持久化后端均可使用。
22
63
 
64
+ ## 贡献
65
+
66
+ - **本地开发**:`npm ci && npm run typecheck && npm test && npm run bundle`(Node 20 或 22)。
67
+ - **源码入口**:[`src/grade.ts`](src/grade.ts)(阈值与等级卡)、[`src/metrics.ts`](src/metrics.ts)(指标提取)、[`src/trend.ts`](src/trend.ts)(`/eval-history` 趋势逻辑)。源码地图与第一次 PR 建议见 [CONTRIBUTING.md](CONTRIBUTING.md)。
68
+ - **当前缺口**:[#1](https://github.com/kittimzhe/dsh-session-eval/issues/1)(阈值可配置)、[#2](https://github.com/kittimzhe/dsh-session-eval/issues/2)(`/eval-history --since`)、[#3](https://github.com/kittimzhe/dsh-session-eval/issues/3)(`/eval-history --out`)——或浏览 [`good first issue` 标签](https://github.com/kittimzhe/dsh-session-eval/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)。
69
+ - **规矩**:行为变更必须带测试;文档必须 `README.md` 与 `README.zh.md` 同步改;版本发布由维护者执行。详见 [CONTRIBUTING.md](CONTRIBUTING.md)。
70
+
23
71
  ## 与基准式评测(dsh-eval)的区别
24
72
 
25
- - `dsh-eval`:**前瞻**——预先写好基准 YAML,跑无头评测,评的是"你预测到的场景"
26
- - 本插件:**回溯**——直接读存量日志,评的是"真实发生的工作",零准备、零额外 token
73
+ | | `dsh-eval`(基准) | `dsh-session-eval`(本插件) |
74
+ |---|---|---|
75
+ | 评什么 | 预先发起的运行 | 已经发生的会话 |
76
+ | 准备 | 编写基准 YAML + 用例 | 零——直接读存量日志 |
77
+ | 裁判 | 跨 trial 的指标折叠 | 固定阈值,确定性 |
78
+ | 擅长 | 上线前基准 | 真实工作的回归追踪 |
27
79
 
28
- 两者互补而非竞争。
80
+ 两者互补而非竞争:基准测你*预测到*的场景,回溯评测看*实际发生*的工作。
29
81
 
30
- ## 快速开始
82
+ ## 命令
31
83
 
32
- ```bash
33
- npm install -g dsh-session-eval
34
- ```
84
+ | 命令 | 效果 |
85
+ |---|---|
86
+ | `/eval` | 当前会话等级卡 |
87
+ | `/eval --id <会话ID>` | 指定会话 |
88
+ | `/eval --json` | 机器可读指标 + 等级卡 |
89
+ | `/eval-diff <前ID> <后ID>` | 回归对比(带噪声带) |
90
+ | `/eval-diff … --json` | 机器可读趋势报告 |
91
+ | `/eval-history [N]` | 本工作区最近 N 个会话成绩单 + 首末趋势 |
92
+ | `/eval-history … --json` | 机器可读历史报告 |
35
93
 
36
- ```text
37
- /eval # 当前会话等级卡
38
- /eval --id <会话ID> # 指定会话
39
- /eval-diff <前> <后> # 回归对比(换插件/prompt 前后各评一次)
40
- /eval-history # 本工作区最近 5 个会话的成绩单 + 首末趋势
41
- /eval-history 12 # 最近 12 个
42
- ```
94
+ `/eval-history` 通过与 `/archive` 相同的 `sessionQuery` 接缝自动找到会话(按当前工作区 `cwd` 过滤),逐个评级,并把首尾两个会话做趋势对比——不用再手动挑 id。已经知道两个关键 id 时用 `/eval-diff`。
43
95
 
44
- `/eval-history` 通过与 `/archive` 相同的 `sessionQuery` 接缝自动找到会话(按当前工作区 `cwd` 过滤),逐个评级,并把首尾两个会话做趋势对比——不用再手动挑 id。
96
+ 典型用法:换插件或 prompt 前后各评十个会话;`Reliability` 持续回归 = 改动伤害了真实工作的早期预警。
45
97
 
46
98
  ## 维度与阈值(确定性,无裁判)
47
99
 
@@ -53,7 +105,9 @@ npm install -g dsh-session-eval
53
105
 
54
106
  ¹ 纠正信号 = 连续用户消息中多出的那条(agent 还没回复用户就重问)——"第一次没做对"的行为学代理指标。
55
107
 
56
- 总评 = 最差维度(保守设计)。Diff 判定带噪声带(错误率 ±2pp 等),微小抖动不会误报回归。
108
+ 总评 = 最差维度(保守设计)。阈值是 [`src/grade.ts`](src/grade.ts) 中的常量;可配置化在路线图上(见 issue)。
109
+
110
+ Diff 判定带噪声带(错误率 ±2pp、Re-ask ±0.5、工具负载 ±1),微小抖动不会误报回归。
57
111
 
58
112
  ## 确定性保证
59
113
 
@@ -62,10 +116,16 @@ npm install -g dsh-session-eval
62
116
  ## 开发
63
117
 
64
118
  ```bash
65
- npm install && npm run typecheck && npm test # 24 个测试
66
- npm run bundle
119
+ npm ci
120
+ npm run typecheck # tsc --noEmit
121
+ npm test # vitest run
122
+ npm run bundle # tsdown → lib/
67
123
  ```
68
124
 
69
125
  ## 许可
70
126
 
71
127
  [MIT](LICENSE)
128
+
129
+ ## 社区
130
+
131
+ - [贡献指南](CONTRIBUTING.md) · [安全策略](SECURITY.md) · [行为准则](CODE_OF_CONDUCT.md)
package/lib/index.d.ts CHANGED
@@ -177,7 +177,7 @@ declare function executeEvalHistory(ctx: Context, invocation: CommandInvocation,
177
177
  *
178
178
  * @module dsh-session-eval/version
179
179
  */
180
- declare const VERSION = "0.2.1";
180
+ declare const VERSION = "0.2.3";
181
181
  //#endregion
182
182
  //#region src/index.d.ts
183
183
  declare const name = "session-eval";
package/lib/index.js CHANGED
@@ -227,7 +227,7 @@ function compareSessions(before, after) {
227
227
  *
228
228
  * @module dsh-session-eval/version
229
229
  */
230
- const VERSION = "0.2.1";
230
+ const VERSION = "0.2.3";
231
231
  //#endregion
232
232
  //#region src/evalCommand.ts
233
233
  const EVAL_USAGE = "Usage: /eval [--id <sessionId>] [--json]";
@@ -327,14 +327,14 @@ async function executeEval(ctx, invocation, seam = ctx.sessionQuery) {
327
327
  if (parsed.json === true) return {
328
328
  kind: "success",
329
329
  text: JSON.stringify({
330
- generator: "dsh-session-eval v0.2.1",
330
+ generator: "dsh-session-eval v0.2.3",
331
331
  metrics,
332
332
  card
333
333
  }, null, 2)
334
334
  };
335
335
  return {
336
336
  kind: "success",
337
- text: renderCard(card, "dsh-session-eval v0.2.1")
337
+ text: renderCard(card, "dsh-session-eval v0.2.3")
338
338
  };
339
339
  }
340
340
  /** Execute /eval-diff against the session-query seam. */
@@ -358,13 +358,13 @@ async function executeEvalDiff(ctx, invocation, seam = ctx.sessionQuery) {
358
358
  if (parsed.json === true) return {
359
359
  kind: "success",
360
360
  text: JSON.stringify({
361
- generator: "dsh-session-eval v0.2.1",
361
+ generator: "dsh-session-eval v0.2.3",
362
362
  report
363
363
  }, null, 2)
364
364
  };
365
365
  return {
366
366
  kind: "success",
367
- text: renderTrend(report, "dsh-session-eval v0.2.1")
367
+ text: renderTrend(report, "dsh-session-eval v0.2.3")
368
368
  };
369
369
  }
370
370
  //#endregion
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-session-eval",
3
3
  "description": "Retrospective agent-session evaluation for DeepSeek Harness: deterministic grade cards from persisted session logs, cross-session regression diffs, era comparison — no benchmark runs, no LLM judges.",
4
- "version": "0.2.1",
4
+ "version": "0.2.3",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },