dsh-eval-pack 0.1.0-alpha.6 → 0.1.0-alpha.8

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,22 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.0-alpha.8] — 2026-11-01
4
+
5
+ ### Added
6
+
7
+ - `eval.summary`: aggregate pass count, pass rate and failing task ids for a graded run, using the same grader as `eval.grade`.
8
+ - Canonical-JSON grading: object key order no longer changes the verdict; array order still matters.
9
+
10
+ Verified by `node --test test/*.test.mjs` (7/7).
11
+
12
+ ## [0.1.0-alpha.7] — 2026-11-01
13
+
14
+ ### Changed
15
+
16
+ - Documentation: five-language fixture/acceptance links now resolve on npm; added specific related-checker/tool links.
17
+ - Marketplace metadata: taxonomy category, archetype, domains and status; docs page now shows the same.
18
+ - Added a real terminal hero (and GIF for the active docs set) plus `TROUBLESHOOTING.md`.
19
+
3
20
  All notable changes to `dsh-eval-pack` are documented here. The format follows Keep a Changelog; this project uses alpha versions.
4
21
 
5
22
  ## [0.1.0-alpha.6] — 2026-11-01
package/README-es.md CHANGED
@@ -33,6 +33,10 @@ dsh plugin --profile <profile> add dsh-eval-pack
33
33
 
34
34
  *Flujo: entrada local → plugin → salida local. No requiere llamada a un modelo.*
35
35
 
36
+ ![Real dsh-eval-pack terminal output](docs/assets/dsh-eval-pack-hero.png)
37
+
38
+ *Ejecución local real; sin modelo ni red.*
39
+
36
40
  ## Instalación
37
41
 
38
42
  Instalar y verificar:
@@ -84,7 +88,7 @@ dsh --profile <profile> --dump-config | grep dsh-eval-pack
84
88
 
85
89
  ### Ejemplo respaldado por fixture
86
90
 
87
- Entrada: [`ACCEPTANCE.csv`](ACCEPTANCE.csv)
91
+ Entrada: [`ACCEPTANCE.csv`](https://github.com/PerryLink/dsh-eval-pack/blob/main/ACCEPTANCE.csv)
88
92
 
89
93
  Comando: `pnpm test`
90
94
 
@@ -134,6 +138,9 @@ pnpm build && pnpm lint && pnpm typecheck && pnpm test
134
138
 
135
139
  Paquetes hermanos e índices de familia: [dsh-policy-ledger](https://github.com/PerryLink/dsh-policy-ledger) · [dsh-pim-lint](https://github.com/PerryLink/dsh-pim-lint)
136
140
 
141
+ Herramientas relacionadas (tabla en inglés): [Related tools](README.md#related-tools).
142
+
143
+ - [Solución de problemas (inglés)](TROUBLESHOOTING.md)
137
144
  - [Índice de dominio](https://perrylink.github.io/dsh-plugins/)
138
145
  - [Familia de checkers](https://perrylink.github.io/zh/checkers/)
139
146
  - [Familia principal](https://github.com/PerryLink/dsh-kit)
package/README-hi.md CHANGED
@@ -33,6 +33,10 @@ dsh plugin --profile <profile> add dsh-eval-pack
33
33
 
34
34
  *वर्कफ़्लो: स्थानीय इनपुट → प्लगइन → स्थानीय आउटपुट। मॉडल कॉल आवश्यक नहीं।*
35
35
 
36
+ ![Real dsh-eval-pack terminal output](docs/assets/dsh-eval-pack-hero.png)
37
+
38
+ *वास्तविक स्थानीय परीक्षण; कोई मॉडल या नेटवर्क कॉल नहीं।*
39
+
36
40
  ## इंस्टॉल
37
41
 
38
42
  इंस्टॉल और सत्यापन:
@@ -84,7 +88,7 @@ dsh --profile <profile> --dump-config | grep dsh-eval-pack
84
88
 
85
89
  ### fixture-आधारित उदाहरण
86
90
 
87
- इनपुट: [`ACCEPTANCE.csv`](ACCEPTANCE.csv)
91
+ इनपुट: [`ACCEPTANCE.csv`](https://github.com/PerryLink/dsh-eval-pack/blob/main/ACCEPTANCE.csv)
88
92
 
89
93
  कमांड: `pnpm test`
90
94
 
@@ -134,6 +138,9 @@ pnpm build && pnpm lint && pnpm typecheck && pnpm test
134
138
 
135
139
  सहोदर पैकेज और परिवार सूचकांक: [dsh-policy-ledger](https://github.com/PerryLink/dsh-policy-ledger) · [dsh-pim-lint](https://github.com/PerryLink/dsh-pim-lint)
136
140
 
141
+ संबंधित टूल (अंग्रेज़ी तालिका): [Related tools](README.md#related-tools).
142
+
143
+ - [समस्या निवारण (अंग्रेज़ी)](TROUBLESHOOTING.md)
137
144
  - [डोमेन सूचकांक](https://perrylink.github.io/dsh-plugins/)
138
145
  - [चेकर परिवार](https://perrylink.github.io/zh/checkers/)
139
146
  - [मुख्य परिवार](https://github.com/PerryLink/dsh-kit)
package/README-pt.md CHANGED
@@ -33,6 +33,10 @@ dsh plugin --profile <profile> add dsh-eval-pack
33
33
 
34
34
  *Fluxo: entrada local → plugin → saída local. Não exige chamada a modelo.*
35
35
 
36
+ ![Real dsh-eval-pack terminal output](docs/assets/dsh-eval-pack-hero.png)
37
+
38
+ *Execução local real; sem modelo ou rede.*
39
+
36
40
  ## Instalação
37
41
 
38
42
  Instalar e verificar:
@@ -84,7 +88,7 @@ dsh --profile <profile> --dump-config | grep dsh-eval-pack
84
88
 
85
89
  ### Exemplo com fixture
86
90
 
87
- Entrada: [`ACCEPTANCE.csv`](ACCEPTANCE.csv)
91
+ Entrada: [`ACCEPTANCE.csv`](https://github.com/PerryLink/dsh-eval-pack/blob/main/ACCEPTANCE.csv)
88
92
 
89
93
  Comando: `pnpm test`
90
94
 
@@ -134,6 +138,9 @@ pnpm build && pnpm lint && pnpm typecheck && pnpm test
134
138
 
135
139
  Pacotes irmãos e índices da família: [dsh-policy-ledger](https://github.com/PerryLink/dsh-policy-ledger) · [dsh-pim-lint](https://github.com/PerryLink/dsh-pim-lint)
136
140
 
141
+ Ferramentas relacionadas (tabela em inglês): [Related tools](README.md#related-tools).
142
+
143
+ - [Solução de problemas (inglês)](TROUBLESHOOTING.md)
137
144
  - [Índice de domínio](https://perrylink.github.io/dsh-plugins/)
138
145
  - [Família de checkers](https://perrylink.github.io/zh/checkers/)
139
146
  - [Família principal](https://github.com/PerryLink/dsh-kit)
package/README-zh.md CHANGED
@@ -33,6 +33,10 @@ dsh plugin --profile <profile> add dsh-eval-pack
33
33
 
34
34
  *工作流:本地输入 → 插件 → 本地输出;不需要调用模型。*
35
35
 
36
+ ![Real dsh-eval-pack terminal output](docs/assets/dsh-eval-pack-hero.png)
37
+
38
+ *本地真实测试运行;不调用模型或网络。*
39
+
36
40
  ## 安装
37
41
 
38
42
  安装并验证:
@@ -84,7 +88,7 @@ dsh --profile <profile> --dump-config | grep dsh-eval-pack
84
88
 
85
89
  ### fixture 支撑的示例
86
90
 
87
- 输入: [`ACCEPTANCE.csv`](ACCEPTANCE.csv)
91
+ 输入: [`ACCEPTANCE.csv`](https://github.com/PerryLink/dsh-eval-pack/blob/main/ACCEPTANCE.csv)
88
92
 
89
93
  命令: `pnpm test`
90
94
 
@@ -128,12 +132,14 @@ pnpm build && pnpm lint && pnpm typecheck && pnpm test
128
132
  - 本地运行;不联网、不调用模型、不上传。
129
133
  - 只使用公开/合成 fixture;不含客户数据或客户证据。
130
134
  - alpha/partial;not counted,不作 GA 或生产可用声明。
131
- - 冻结包仍可安装;不再加新功能,只修真实故障。
132
135
 
133
136
  ## 相关项目
134
137
 
135
138
  兄弟包与家族索引: [dsh-policy-ledger](https://github.com/PerryLink/dsh-policy-ledger) · [dsh-pim-lint](https://github.com/PerryLink/dsh-pim-lint)
136
139
 
140
+ 相关工具(英文表): [Related tools](README.md#related-tools).
141
+
142
+ - [故障排查(英文)](TROUBLESHOOTING.md)
137
143
  - [领域索引](https://perrylink.github.io/dsh-plugins/)
138
144
  - [Checker 家族](https://perrylink.github.io/zh/checkers/)
139
145
  - [主线家族](https://github.com/PerryLink/dsh-kit)
package/README.md CHANGED
@@ -33,6 +33,10 @@ dsh plugin --profile <profile> add dsh-eval-pack
33
33
 
34
34
  *Workflow: local input → plugin → local output. No model call is required.*
35
35
 
36
+ ![Real dsh-eval-pack terminal output](docs/assets/dsh-eval-pack-hero.png)
37
+
38
+ *Real local test run; no model or network call.*
39
+
36
40
  ## Install
37
41
 
38
42
  Install and verify:
@@ -84,7 +88,7 @@ dsh --profile <profile> --dump-config | grep dsh-eval-pack
84
88
 
85
89
  ### Fixture-backed example
86
90
 
87
- Input: [`ACCEPTANCE.csv`](ACCEPTANCE.csv)
91
+ Input: [`ACCEPTANCE.csv`](https://github.com/PerryLink/dsh-eval-pack/blob/main/ACCEPTANCE.csv)
88
92
 
89
93
  Command: `pnpm test`
90
94
 
@@ -128,12 +132,23 @@ pnpm build && pnpm lint && pnpm typecheck && pnpm test
128
132
  - Runs locally; no network, no model call, no upload.
129
133
  - Public/synthetic fixtures only; no customer data, no customer evidence.
130
134
  - Alpha/partial; not counted, no GA or production-readiness claim.
131
- - Frozen packages stay installable; no new features, only genuine breakage fixes.
132
135
 
133
136
  ## Related work
134
137
 
135
138
  Sibling packages and family indexes: [dsh-policy-ledger](https://github.com/PerryLink/dsh-policy-ledger) · [dsh-pim-lint](https://github.com/PerryLink/dsh-pim-lint)
136
139
 
140
+
141
+ ### Related tools
142
+
143
+ Each entry is a separate package with its own tool surface and version; install only the ones you need.
144
+
145
+ | Package | Why it is relevant |
146
+ |---|---|
147
+ | [`dsh-score`](https://github.com/PerryLink/dsh-score) | Scoring and evaluation utilities. |
148
+ | [`dsh-doublecheck`](https://github.com/PerryLink/dsh-doublecheck) | Requirements/test/adversary quality gate. |
149
+ | [`dsh-test-drive`](https://github.com/PerryLink/dsh-test-drive) | Test-driving workflows and CI checks. |
150
+
151
+ - [Troubleshooting](TROUBLESHOOTING.md)
137
152
  - [Domain index](https://perrylink.github.io/dsh-plugins/)
138
153
  - [Checker family](https://perrylink.github.io/zh/checkers/)
139
154
  - [Mainline family](https://github.com/PerryLink/dsh-kit)
@@ -0,0 +1,45 @@
1
+ # Troubleshooting — dsh-eval-pack
2
+
3
+ ## Install or activation fails
4
+
5
+ - DSH must satisfy `>=0.2.1-rc.3 <0.3.0`; Node must be `>=24.9 <25`.
6
+ - Run `dsh --version` and `node --version`, then retry with a fresh `DSH_HOME`:
7
+
8
+ ```sh
9
+ export DSH_HOME="$(mktemp -d)"
10
+ dsh plugin --profile <profile> add dsh-eval-pack
11
+ dsh --profile <profile> --dump-config | grep dsh-eval-pack
12
+ ```
13
+
14
+ ## The tool cannot find an input
15
+
16
+ - All paths are local. Use an absolute path, or a path relative to the process working directory.
17
+ - The public samples under `fixtures/` are repository-only; they are not shipped in the npm tarball. Download them from the GitHub repository if needed.
18
+ - Supported material: eval-pack JSON.
19
+
20
+ ## Parse or encoding failures
21
+
22
+ - Text inputs must be UTF-8; CSV headers must match the README's documented column names.
23
+ - Remove a UTF-8 BOM if the first header is reported as unknown.
24
+ - Check the pack name/version and unique task ids; grading is deterministic JSON equality, not a benchmark.
25
+
26
+ ## Permission or write failures
27
+
28
+ - Tools marked `R1 local write` write under the configured DSH data directory.
29
+ - For tests, point `DSH_HOME` at a temporary directory; do not write into a real profile.
30
+
31
+ ## The result looks wrong
32
+
33
+ - Check the tool boundary in the README first. These are public/synthetic alpha tools, not a production or customer-validated determination.
34
+ - Compare the reported row ids and input rows; the output is deliberately explicit about what it could not run.
35
+
36
+ ## Run the tests
37
+
38
+ ```sh
39
+ pnpm install --frozen-lockfile
40
+ pnpm test
41
+ ```
42
+
43
+ ## Report
44
+
45
+ Open an issue on <https://github.com/PerryLink/dsh-eval-pack/issues> with the package version, a minimal synthetic input, and the exact tool call. Do not attach customer data.
@@ -8,4 +8,19 @@ export interface EvalPack {
8
8
  tasks: EvalTask[];
9
9
  }
10
10
  export declare function lintPack(input: unknown): string[];
11
+ /** Stable serialisation: object keys sorted at every level, arrays kept in order. */
12
+ export declare function canonical(value: unknown): string;
11
13
  export declare function grade(actual: unknown, expected: unknown): boolean;
14
+ export interface EvalResult {
15
+ id: string;
16
+ actual: unknown;
17
+ expected: unknown;
18
+ }
19
+ export interface EvalSummary {
20
+ total: number;
21
+ passed: number;
22
+ failed: number;
23
+ pass_rate: number;
24
+ failures: string[];
25
+ }
26
+ export declare function summarize(results: EvalResult[]): EvalSummary;
@@ -23,6 +23,33 @@ export function lintPack(input) {
23
23
  }
24
24
  return errors;
25
25
  }
26
+ /** Stable serialisation: object keys sorted at every level, arrays kept in order. */
27
+ export function canonical(value) {
28
+ const walk = (input) => {
29
+ if (Array.isArray(input))
30
+ return input.map(walk);
31
+ if (input && typeof input === 'object') {
32
+ const out = {};
33
+ for (const key of Object.keys(input).sort())
34
+ out[key] = walk(input[key]);
35
+ return out;
36
+ }
37
+ return input;
38
+ };
39
+ return JSON.stringify(walk(value));
40
+ }
26
41
  export function grade(actual, expected) {
27
- return JSON.stringify(actual) === JSON.stringify(expected);
42
+ return canonical(actual) === canonical(expected);
43
+ }
44
+ export function summarize(results) {
45
+ const failures = [];
46
+ let passed = 0;
47
+ for (const r of results) {
48
+ if (grade(r.actual, r.expected))
49
+ passed += 1;
50
+ else
51
+ failures.push(r.id);
52
+ }
53
+ const total = results.length;
54
+ return { total, passed, failed: total - passed, pass_rate: total ? Math.round((passed / total) * 1e6) / 1e6 : 0, failures };
28
55
  }
@@ -1,5 +1,5 @@
1
1
  import { defineTool } from '@deepseek-ai/dsh-tools';
2
- import { grade, lintPack } from '../core/harness.js';
2
+ import { grade, lintPack, summarize } from '../core/harness.js';
3
3
  const text = (t) => [{ type: 'text', text: t }];
4
4
  export function createTools() {
5
5
  const lint = defineTool({
@@ -16,5 +16,12 @@ export function createTools() {
16
16
  output: { schema: { type: 'object', additionalProperties: false, properties: { pass: { type: 'boolean', required: true } } }, render: (_a, v) => text(`grade ${v.pass ? 'pass' : 'fail'}`) },
17
17
  async execute(args) { return { pass: grade(args.actual, args.expected) }; },
18
18
  });
19
- return [lint, gradeTool];
19
+ const summary = defineTool({
20
+ name: 'eval.summary',
21
+ description: 'Aggregate graded results for a public/synthetic run: pass count, pass rate and the failing task ids, using the same canonical-JSON grader. Read-only; no runner.',
22
+ parameters: { results: { type: 'array', required: true, items: { type: 'object', additionalProperties: false, properties: { id: { type: 'string', required: true }, actual: { type: 'json', required: true }, expected: { type: 'json', required: true } } } } },
23
+ output: { schema: { type: 'object', additionalProperties: false, properties: { total: { type: 'number', required: true }, passed: { type: 'number', required: true }, failed: { type: 'number', required: true }, pass_rate: { type: 'number', required: true }, failures: { type: 'array', items: { type: 'string' }, required: true } } }, render: (_a, v) => text(`summary ${v.passed}/${v.total}`) },
24
+ async execute(args) { return summarize(args.results); },
25
+ });
26
+ return [lint, gradeTool, summary];
20
27
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-eval-pack",
3
- "version": "0.1.0-alpha.6",
3
+ "version": "0.1.0-alpha.8",
4
4
  "description": "Public/synthetic eval-pack lint and deterministic JSON grader; not a validated benchmark.",
5
5
  "type": "module",
6
6
  "main": "./lib/plugin/index.js",
@@ -27,6 +27,8 @@
27
27
  "CODE_OF_CONDUCT.md",
28
28
  "CONTRIBUTING.md",
29
29
  "CHANGELOG.md",
30
+ "TROUBLESHOOTING.md",
31
+ "screenshots.json",
30
32
  "icon.svg"
31
33
  ],
32
34
  "dsh": {
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "path": "docs/assets/dsh-eval-pack-hero.png",
4
+ "kind": "hero",
5
+ "alt": "dsh-eval-pack terminal output",
6
+ "caption": "Real dsh-eval-pack local test run; 3 tests passed."
7
+ },
8
+ {
9
+ "path": "docs/assets/dsh-eval-pack-demo.gif",
10
+ "kind": "demo",
11
+ "alt": "Animated dsh-eval-pack terminal session",
12
+ "caption": "The same run, assembled line by line."
13
+ },
14
+ {
15
+ "path": "docs/assets/dsh-eval-pack-capability.png",
16
+ "kind": "capability",
17
+ "alt": "dsh-eval-pack real test run",
18
+ "caption": "Real command: node --test test/summary.test.mjs — 4 tests passed, 0 failed (canonical grading and run summary). Run 2026-11-01; the image is rendered from the captured terminal output."
19
+ }
20
+ ]