dsh-auto-review 0.12.3 → 0.12.5

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
@@ -2,6 +2,26 @@
2
2
 
3
3
  All notable changes to `dsh-auto-review` are documented here. The repo is pre-release; versions follow the DeepSeek Harness `0.1.0-rc.x` target runtime and bump on every behavior change.
4
4
 
5
+ ## [0.12.5] - 2026-09-18
6
+
7
+ ### Changed
8
+
9
+ - Land the eval fixtures on the alpha.2 model vocabulary: `eval/cordis.yml` and `eval/cases/demo.yaml` (plus the five README run examples) now name `deepseek-flash` instead of the removed `deepseek-v4-flash` id, and the compatibility row admits the `>=0.1.6-0 <0.2.0` peer segment.
10
+ - Declare `dsh.manifestVersion: 1` and the canonical three-clause `engines.dsh` (G-3).
11
+
12
+ ### Notes
13
+
14
+ - The A2 wrapper static assertion (a lint rule proving `src/session-events.ts` stays the only `snapshotEvents()` call site) is **not yet enforceable here**: this repo lints with oxlint (96 rules, no `typescript/no-deprecated` rule configured), so the card's precondition does not hold. The single call site is unchanged and documented; the assertion can land once the rule is enabled.
15
+ - The resume round-trip criterion (`check-session-log.mjs` over a real log) still needs a real host log; the audit gate contract plus the existing regression tests pin the no-unmarked-append invariant in the meantime.
16
+
17
+ ## [0.12.4] - 2026-09-12
18
+
19
+ ### Fixed
20
+
21
+ - Correct the host-capability documentation that claimed a later harness line could stamp the `ignorable` envelope marker from `Session.append`. **No published line can**, and the code was right all along. Verified three ways: the host source (`packages/core/session/src/index.ts:710-738` — the optional third parameter is `SurfaceIntent`, accepted for surface event types only, and the envelope is assembled from `{ type, seq, time, data }` plus `surfaceOp`/`sourceEventSeqs` alone), every relevant published tarball (`0.1.0-rc.2/3/6/7/8`, `0.1.1-rc.1/2`, `0.1.2-alpha.2–alpha.5`, `0.1.2-rc.1`, `0.1.3-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2` — all build the same envelope), and a live append against the host's own built `Session` on the `0.1.5-rc.2` line, which returns keys `["type","seq","time","data"]` with `ignorable` undefined. The marker is reachable only through the seed/restore path, i.e. it is written by the harness that owns the log, never by a plugin appending to it. `isUnmarkedHostVersion` returning `true` for the whole published 0.1.x range is therefore accurate and not an over-reach; it is now pinned by a test so a future "narrow the bound" change cannot silently become the log pollution the guard exists to prevent. Reported with the opposite diagnosis on issue #38.
22
+ - Rewrite the `auditDisabledNotice` (EN + ZH), the `warnUnmarkedAuditHost` warning, the `allowUnmarkedAudit` config doc, and the AGENTS.md audit bullet so they no longer say the host "predates" the marker or that unmarked events break resume only "on stricter harness builds". The unmarked event is refused by `validateStoredEvents` on **every** validating harness, reached from the ordinary local jsonl load path — and `allowUnmarkedAudit: true` is now stated as what it is: a switch that makes those sessions unloadable, not a compatibility workaround. The previous wording led a user to recommend it publicly as safe on `0.1.5-rc.2`.
23
+ - Add a regression test that calls the installed peer's real `Session.append` with `{ ignorable: true }` on an out-of-tree type and asserts the returned envelope carries no marker, plus a table test over every published 0.1.x version string.
24
+
5
25
  ## [0.12.3] - 2026-09-12
6
26
 
7
27
  ### Changed
package/README-es.md CHANGED
@@ -9,6 +9,7 @@
9
9
  > **Repositorio oficial.** Este es el único repositorio oficial de dsh-auto-review, mantenido por PerryLink. Los repositorios del mismo nombre bajo otras cuentas no están afiliados.
10
10
 
11
11
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
12
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-auto-review)
12
13
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
14
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-auto-review.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
15
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
@@ -27,7 +28,7 @@
27
28
 
28
29
  | Superficie | Estado |
29
30
  |---|---|
30
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (tag de GitHub, verificado el 2026-09-11). Soporte npm de doble línea: pins de desarrollo y dependencias de runtime `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0` — el código del plugin detecta ambas líneas de host publicadas (detección de características) y cada línea ejecuta la cadena completa de gates; las dependencias de runtime siguen la línea alpha para que una instalación en un perfil nunca sombree el árbol `0.1.5-rc.2` del host. |
31
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.2` (verificado el 2026-09-18). Soporte npm de doble línea: pins de desarrollo y dependencias de runtime `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0 \|\| >=0.1.6-0 <0.2.0` — el código del plugin detecta las líneas de host publicadas (detección de características) y cada línea ejecuta la cadena completa de gates; las dependencias de runtime siguen la línea alpha para que una instalación en un perfil nunca sombree el árbol del host. En la línea alpha.2 los fixtures de eval fijan `deepseek-flash` (el id eliminado `deepseek-v4-flash` ya no aparece en `eval/`). |
31
32
  | Node | `^22.19.0 \|\| >=24.0.0` |
32
33
  | Plataformas | Todas (answerer de host; panel web opcional mediante la capacidad de proyección de sesión) |
33
34
  | Modelo | Cualquiera (el revisor hereda la ruta del agente de sesión; `reviewerModel` la reemplaza) |
@@ -227,7 +228,7 @@ suite:
227
228
  Ejecútalo (una clave de API de DeepSeek debe estar en el entorno):
228
229
 
229
230
  ```sh
230
- dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
231
+ dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
231
232
  ```
232
233
 
233
234
  ### Familias de aserciones
@@ -264,7 +265,7 @@ Puerta de CI: el proceso sale con 0 solo cuando todos los casos de todas las sui
264
265
 
265
266
  ```yaml
266
267
  - name: dsh-eval
267
- run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
268
+ run: npx dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
268
269
  env:
269
270
  DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
270
271
  ```
@@ -354,7 +355,7 @@ El servidor es de solo lectura y determinista: sin red, sin modelo, sin escritur
354
355
  ```sh
355
356
  pnpm install # node ^22.19 || >=24
356
357
  pnpm run typecheck # tsc: src + tests contra el checkout local del harness
357
- pnpm test # vitest: 190 tests, 14 archivos
358
+ pnpm test # vitest: 25 archivos spec
358
359
  pnpm run build # declaraciones tsc + bundles tsdown (lib/, incluido el bundle de cliente)
359
360
  pnpm run verify:self-contained
360
361
  pnpm pack # el tarball publicado
@@ -374,7 +375,7 @@ Estructura del repositorio: `src/index.ts` (contrato del plugin) · `src/config.
374
375
 
375
376
  ## Familia de plugins DSH de PerryLink
376
377
 
377
- Este proyecto es uno de los [37 complementos de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, probablemente los demás también:
378
+ Este proyecto es uno de los [40 complementos de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, probablemente los demás también:
378
379
 
379
380
  | Plugin | One-liner |
380
381
  |---|---|
@@ -413,7 +414,17 @@ Este proyecto es uno de los [37 complementos de DeepSeek Harness](https://github
413
414
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Pruebas de instalación y humo aisladas para plugins de DeepSeek Harness. | |
414
415
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | Puente de tareas TickTick/Dida365: panel de cabecera de sesión + 11 herramientas |
415
416
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Traducción de parámetros entre proveedores y reparación determinista de JSON para DeepSeek Harness. | |
416
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | Puente WeChat ↔ DSH (bot Tencent iLink): texto/imagen/archivo/voz, aprobaciones en el chat |
417
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | Puente WeChat ↔ DSH (bot Tencent iLink): texto/imagen/archivo/voz, aprobaciones en el chat |
418
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
419
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
420
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
421
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
422
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
423
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
424
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
425
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
426
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
427
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
417
428
 
418
429
  ### Instalar desde el mercado de DSH Desktop
419
430
 
package/README-hi.md CHANGED
@@ -9,6 +9,7 @@
9
9
  > **आधिकारिक रिपॉज़िटरी।** यह PerryLink द्वारा अनुरक्षित dsh-auto-review का एकमात्र आधिकारिक रिपॉज़िटरी है। अन्य खातों के समान-नाम रिपॉज़िटरी इससे संबद्ध नहीं हैं।
10
10
 
11
11
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
12
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-auto-review)
12
13
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
14
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-auto-review.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
15
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
@@ -27,7 +28,7 @@
27
28
 
28
29
  | सतह | स्थिति |
29
30
  |---|---|
30
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (GitHub tag, 2026-09-11 को सत्यापित)। दोहरी-लाइन npm समर्थन: dev पिन और रनटाइम निर्भरताएँ `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0` — प्लगइन कोड दोनों प्रकाशित होस्ट लाइनों को फ़ीचर-डिटेक्ट करता है और हर लाइन पूरी गेट श्रृंखला चलाती है; रनटाइम निर्भरताएँ alpha लाइन का पालन करती हैं ताकि प्रोफ़ाइल इंस्टॉल होस्ट के अपने `0.1.5-rc.2` ट्री को शैडो न करें। |
31
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.2` (2026-09-18 को सत्यापित)। दोहरी-लाइन npm समर्थन: dev पिन और रनटाइम निर्भरताएँ `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0 \|\| >=0.1.6-0 <0.2.0` — प्लगइन कोड प्रकाशित होस्ट लाइनों को फ़ीचर-डिटेक्ट करता है और हर लाइन पूरी गेट श्रृंखला चलाती है; रनटाइम निर्भरताएँ alpha लाइन का पालन करती हैं ताकि प्रोफ़ाइल इंस्टॉल होस्ट के अपने ट्री को शैडो न करें। alpha.2 लाइन पर eval फ़िक्स्चर `deepseek-flash` पिन करते हैं (हटाया गया `deepseek-v4-flash` अब `eval/` में नहीं है)। |
31
32
  | Node | `^22.19.0 \|\| >=24.0.0` |
32
33
  | प्लेटफ़ॉर्म | सभी (होस्ट answerer; सत्र-प्रोजेक्शन क्षमता के ज़रिए वैकल्पिक वेब समीक्षा पैनल) |
33
34
  | मॉडल | कोई भी (समीक्षक सत्र एजेंट का मार्ग विरासत में लेता है; `reviewerModel` उसे बदल देता है) |
@@ -227,7 +228,7 @@ suite:
227
228
  इसे चलाएँ (वातावरण में एक DeepSeek API कुंजी होनी चाहिए):
228
229
 
229
230
  ```sh
230
- dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
231
+ dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
231
232
  ```
232
233
 
233
234
  ### दावा परिवार
@@ -264,7 +265,7 @@ CI द्वार: प्रक्रिया केवल तभी 0 से
264
265
 
265
266
  ```yaml
266
267
  - name: dsh-eval
267
- run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
268
+ run: npx dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
268
269
  env:
269
270
  DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
270
271
  ```
@@ -354,7 +355,7 @@ Claude Desktop (`claude_desktop_config.json`) उदाहरण:
354
355
  ```sh
355
356
  pnpm install # node ^22.19 || >=24
356
357
  pnpm run typecheck # tsc: src + tests, स्थानीय harness checkout के विरुद्ध
357
- pnpm test # vitest: 190 परीक्षण, 14 फ़ाइलें
358
+ pnpm test # vitest: 25 spec फ़ाइलें
358
359
  pnpm run build # tsc घोषणाएँ + tsdown बंडल (lib/, क्लाइंट बंडल सहित)
359
360
  pnpm run verify:self-contained
360
361
  pnpm pack # प्रकाशित tarball
@@ -374,7 +375,7 @@ pnpm pack # प्रकाशित tarball
374
375
 
375
376
  ## PerryLink DSH प्लगइन परिवार
376
377
 
377
- यह प्रोजेक्ट [PerryLink](https://github.com/PerryLink) द्वारा अनुरक्षित [37 DeepSeek Harness प्लगइनों](https://github.com/PerryLink) में से एक है। अगर यह आपकी मदद करता है, तो बाकी भी करेंगे:
378
+ यह प्रोजेक्ट [PerryLink](https://github.com/PerryLink) द्वारा अनुरक्षित [40 DeepSeek Harness प्लगइनों](https://github.com/PerryLink) में से एक है। अगर यह आपकी मदद करता है, तो बाकी भी करेंगे:
378
379
 
379
380
  | Plugin | One-liner |
380
381
  |---|---|
@@ -413,7 +414,17 @@ pnpm pack # प्रकाशित tarball
413
414
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | DeepSeek Harness प्लगिनों के लिए पृथक इंस्टॉल-एंड-स्मोक टेस्ट ड्राइव। | |
414
415
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 कार्य ब्रिज: सत्र-हेडर पैनल + 11 टूल |
415
416
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | DeepSeek Harness के लिए वेंडर पैरामीटर अनुवाद और नियतात्मक JSON मरम्मत। | |
416
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | WeChat ↔ DSH ब्रिज (Tencent iLink bot): टेक्स्ट/इमेज/फ़ाइल/आवाज़, चैट में अनुमोदन |
417
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat ↔ DSH ब्रिज (Tencent iLink bot): टेक्स्ट/इमेज/फ़ाइल/आवाज़, चैट में अनुमोदन |
418
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
419
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
420
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
421
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
422
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
423
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
424
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
425
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
426
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
427
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
417
428
 
418
429
  ### DSH Desktop मार्केट से इंस्टॉल करें
419
430
 
package/README-pt.md CHANGED
@@ -9,6 +9,7 @@
9
9
  > **Repositório oficial.** Este é o único repositório oficial do dsh-auto-review, mantido por PerryLink. Repositórios de mesmo nome sob outras contas não são afiliados.
10
10
 
11
11
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
12
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-auto-review)
12
13
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
14
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-auto-review.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
15
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
@@ -27,7 +28,7 @@
27
28
 
28
29
  | Superfície | Status |
29
30
  |---|---|
30
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (tag do GitHub, verificado em 2026-09-11). Suporte npm de linha dupla: pins de desenvolvimento e dependências de runtime `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0` — o código do plugin detecta ambas as linhas de host publicadas (detecção de recursos) e cada linha executa a cadeia completa de gates; as dependências de runtime seguem a linha alpha para que uma instalação em um perfil nunca sombreie a árvore `0.1.5-rc.2` do host. |
31
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.2` (verificado em 2026-09-18). Suporte npm de linha dupla: pins de desenvolvimento e dependências de runtime `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0 \|\| >=0.1.6-0 <0.2.0` — o código do plugin detecta as linhas de host publicadas (detecção de recursos) e cada linha executa a cadeia completa de gates; as dependências de runtime seguem a linha alpha para que uma instalação em um perfil nunca sombreie a árvore do host. Na linha alpha.2 os fixtures de eval fixam `deepseek-flash` (o id removido `deepseek-v4-flash` não aparece mais em `eval/`). |
31
32
  | Node | `^22.19.0 \|\| >=24.0.0` |
32
33
  | Plataformas | Todas (answerer de host; painel web opcional via capacidade de projeção de sessão) |
33
34
  | Modelo | Qualquer (o revisor herda a rota do agente da sessão; `reviewerModel` sobrescreve) |
@@ -227,7 +228,7 @@ suite:
227
228
  Execute-o (uma chave de API da DeepSeek deve estar no ambiente):
228
229
 
229
230
  ```sh
230
- dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
231
+ dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
231
232
  ```
232
233
 
233
234
  ### Famílias de asserção
@@ -264,7 +265,7 @@ Portão de CI: o processo sai com 0 somente quando todos os casos de todas as su
264
265
 
265
266
  ```yaml
266
267
  - name: dsh-eval
267
- run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
268
+ run: npx dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
268
269
  env:
269
270
  DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
270
271
  ```
@@ -354,7 +355,7 @@ O servidor é somente-leitura e determinista: sem rede, sem modelo, sem gravaç
354
355
  ```sh
355
356
  pnpm install # node ^22.19 || >=24
356
357
  pnpm run typecheck # tsc: src + tests contra o checkout local do harness
357
- pnpm test # vitest: 190 testes, 14 arquivos
358
+ pnpm test # vitest: 25 arquivos spec
358
359
  pnpm run build # declarações tsc + bundles tsdown (lib/, incluindo o bundle de cliente)
359
360
  pnpm run verify:self-contained
360
361
  pnpm pack # o tarball publicado
@@ -374,7 +375,7 @@ Layout do repositório: `src/index.ts` (contrato do plugin) · `src/config.ts` (
374
375
 
375
376
  ## Família de Plugins DSH PerryLink
376
377
 
377
- Este projeto é um dos [37 plugins de DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajuda você, os outros provavelmente também:
378
+ Este projeto é um dos [40 plugins de DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajuda você, os outros provavelmente também:
378
379
 
379
380
  | Plugin | One-liner |
380
381
  |---|---|
@@ -413,11 +414,17 @@ Este projeto é um dos [37 plugins de DeepSeek Harness](https://github.com/Perry
413
414
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Test drives isolados de instalação e smoke para plugins de DeepSeek Harness. | |
414
415
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | Ponte de tarefas TickTick/Dida365: painel no cabeçalho da sessão + 11 ferramentas |
415
416
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Tradução de parâmetros entre fornecedores e reparo determinístico de JSON para DeepSeek Harness. | |
416
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | Ponte WeChat ↔ DSH (bot Tencent iLink): texto/imagem/arquivo/voz, aprovações no chat |
417
-
418
- ### Instalar a partir do mercado do DSH Desktop
419
-
420
- Todos os plugins PerryLink podem ser explorados no mercado integrado do DSH Desktop: **Market → Sources → add source → colar** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ selecionar**. A instalação continua passando pela verificação de identidade npm do mercado e pela sua confirmação.
417
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | Ponte WeChat ↔ DSH (bot Tencent iLink): texto/imagem/arquivo/voz, aprovações no chat |
418
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
419
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
420
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
421
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
422
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
423
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
424
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
425
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
426
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
427
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
421
428
 
422
429
  ## Licença
423
430
 
package/README-zh.md CHANGED
@@ -9,6 +9,7 @@
9
9
  > **官方仓库。** 本仓库是 dsh-auto-review 的唯一官方仓库,由 PerryLink 维护。其他账号下的同名仓库与本项目无关。
10
10
 
11
11
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
12
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-auto-review)
12
13
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
14
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-auto-review.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
15
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
@@ -27,7 +28,7 @@
27
28
 
28
29
  | 方面 | 状态 |
29
30
  |---|---|
30
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2`(GitHub tag,2026-09-11 已核验)。双线 npm 支持:dev 钉号与运行时依赖均为 `0.1.5-rc.2`、peer 范围 `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0` —— 插件代码兼容两条已发布宿主线(特性探测),两线均跑完整门禁链;运行时依赖钉号随 alpha 线,避免 profile 安装遮蔽宿主自带的 `0.1.5-rc.2` 树。 |
31
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.2`(2026-09-18 已核验)。双线 npm 支持:dev 钉号与运行时依赖均为 `0.1.5-rc.2`、peer 范围 `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0 \|\| >=0.1.6-0 <0.2.0` —— 插件代码兼容各已发布宿主线(特性探测),各线均跑完整门禁链;运行时依赖钉号随 alpha 线,避免 profile 安装遮蔽宿主自带树。alpha.2 线上 eval 夹具钉 `deepseek-flash`(已移除的 `deepseek-v4-flash` 不再出现在 `eval/`)。 |
31
32
  | Node | `^22.19.0 \|\| >=24.0.0` |
32
33
  | 平台 | 全部(宿主 answerer;可选 Web 审查面板,依赖会话投影能力) |
33
34
  | 模型 | 任意(审查器默认继承会话代理的路由;`reviewerModel` 可覆盖) |
@@ -227,7 +228,7 @@ suite:
227
228
  运行(环境需有 DeepSeek API 密钥):
228
229
 
229
230
  ```sh
230
- dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
231
+ dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
231
232
  ```
232
233
 
233
234
  ### 断言族
@@ -264,7 +265,7 @@ CI 门禁:仅当每个套件的每个用例都通过时,进程才以 0 退
264
265
 
265
266
  ```yaml
266
267
  - name: dsh-eval
267
- run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
268
+ run: npx dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
268
269
  env:
269
270
  DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
270
271
  ```
@@ -354,7 +355,7 @@ Claude Desktop(`claude_desktop_config.json`)配置示例:
354
355
  ```sh
355
356
  pnpm install # node ^22.19 || >=24
356
357
  pnpm run typecheck # tsc:src + tests,针对本地 harness 检出
357
- pnpm test # vitest:190 个测试,14 个文件
358
+ pnpm test # vitest:25 个 spec 文件
358
359
  pnpm run build # tsc 声明 + tsdown 打包(lib/,含客户端包)
359
360
  pnpm run verify:self-contained
360
361
  pnpm pack # 发布产物
@@ -374,7 +375,7 @@ pnpm pack # 发布产物
374
375
 
375
376
  ## PerryLink DSH 插件家族
376
377
 
377
- 这是 [PerryLink](https://github.com/PerryLink) 维护的 [37 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果它能帮到你,其他的也会:
378
+ 这是 [PerryLink](https://github.com/PerryLink) 维护的 [40 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果它能帮到你,其他的也会:
378
379
 
379
380
  | Plugin | One-liner |
380
381
  |---|---|
@@ -404,6 +405,7 @@ pnpm pack # 发布产物
404
405
  | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code 风格声明式 allow/deny/ask 权限规则,带审计 | |
405
406
  | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | 个人指令注入器:顶栏开关(框架版) |
406
407
  | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | 作为按需代理技能的插件开发知识库 | |
408
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
407
409
  | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | 可验证研究报告引擎:内容寻址证据账本与封存版本 | |
408
410
  | **[dsh-score](https://github.com/PerryLink/dsh-score)** | DeepSeek Harness 插件的多维质量评分。 | |
409
411
  | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 在 Web 侧栏置顶会话,带持久排序 | |
@@ -413,7 +415,16 @@ pnpm pack # 发布产物
413
415
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | DeepSeek Harness 插件的隔离试装冒烟。 | |
414
416
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/滴答清单任务桥接:会话头面板 + 11 个工具 |
415
417
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | DeepSeek Harness 的厂商参数翻译与确定性 JSON 修复。 | |
416
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | 微信 ↔ DSH 桥接(Tencent iLink 机器人):文本/图片/文件/语音,聊天内审批卡片 |
418
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | 微信 ↔ DSH 桥接(Tencent iLink 机器人):文本/图片/文件/语音,聊天内审批卡片 |
419
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
420
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
421
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
422
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
423
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
424
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
425
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
426
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
427
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
417
428
 
418
429
  ### 从 DSH Desktop 市场安装
419
430
 
package/README.md CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  | Surface | Status |
30
30
  |---|---|
31
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (GitHub tag, verified 2026-09-11). Dual-line npm support: dev pins and runtime deps `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0` — the plugin code feature-detects both published host lines and each line runs the full gate chain; the runtime dependency pins follow the alpha line so a profile install never shadows the host's own `0.1.5-rc.2` tree. |
31
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.2` (verified 2026-09-18). Dual-line npm support: dev pins and runtime deps `0.1.5-rc.2`, peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0 \|\| >=0.1.6-0 <0.2.0` — the plugin code feature-detects the published host lines and each line runs the full gate chain; the runtime dependency pins follow the alpha line so a profile install never shadows the host's own tree. On the alpha.2 line the eval fixtures pin `deepseek-flash` (the removed `deepseek-v4-flash` id is gone from `eval/`). |
32
32
  | Node | `^22.19.0 \|\| >=24.0.0` |
33
33
  | Platforms | All (host answerer; optional Web review panel via the session-projection capability) |
34
34
  | Model | Any (the reviewer inherits the session agent's route; `reviewerModel` overrides) |
@@ -229,7 +229,7 @@ suite:
229
229
  Run it (a DeepSeek API key must be in the environment):
230
230
 
231
231
  ```sh
232
- dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
232
+ dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
233
233
  ```
234
234
 
235
235
  ### Assertion families
@@ -266,7 +266,7 @@ CI gate: the process exits 0 only when every case of every suite passed — fail
266
266
 
267
267
  ```yaml
268
268
  - name: dsh-eval
269
- run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
269
+ run: npx dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
270
270
  env:
271
271
  DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
272
272
  ```
@@ -356,7 +356,7 @@ The server is read-only and deterministic: no network, no model, no writes.
356
356
  ```sh
357
357
  pnpm install # node ^22.19 || >=24
358
358
  pnpm run typecheck # tsc: src + tests against the local harness checkout
359
- pnpm test # vitest: 233 tests, 20 files
359
+ pnpm test # vitest: 25 spec files
360
360
  pnpm run build # tsc declarations + tsdown bundles (lib/, incl. the client bundle)
361
361
  pnpm run verify:self-contained
362
362
  pnpm pack # the published tarball
@@ -376,7 +376,7 @@ Repository layout: `src/index.ts` (plugin contract) · `src/config.ts` (Schemast
376
376
 
377
377
  ## PerryLink DSH Plugin Family
378
378
 
379
- This project is one of the [37 DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
379
+ This project is one of the [40 DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
380
380
 
381
381
  | Plugin | One-liner |
382
382
  |---|---|
@@ -406,6 +406,7 @@ This project is one of the [37 DeepSeek Harness plugins](https://github.com/Perr
406
406
  | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
407
407
  | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Personal directive injector with top-bar toggle (framework edition) |
408
408
  | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
409
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
409
410
  | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
410
411
  | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
411
412
  | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
@@ -415,7 +416,16 @@ This project is one of the [37 DeepSeek Harness plugins](https://github.com/Perr
415
416
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
416
417
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools |
417
418
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
418
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | WeChat ↔ DSH bridge (Tencent iLink bot): text/image/file/voice, approvals in chat |
419
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat ↔ DSH bridge (Tencent iLink bot): text/image/file/voice, approvals in chat |
420
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
421
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
422
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
423
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
424
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
425
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
426
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
427
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
428
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
419
429
 
420
430
  ### Install from the DSH Desktop Market
421
431
 
@@ -1,7 +1,7 @@
1
1
  # dsh-eval demo suite — three cases that exercise this repository itself.
2
2
  #
3
3
  # Run from the repo root:
4
- # dsh-eval eval/cases --model deepseek-v4-flash --out .eval-reports
4
+ # dsh-eval eval/cases --model deepseek-flash --out .eval-reports
5
5
  #
6
6
  # The cases need no hardcoded model/timeout here: the CLI (or a suite
7
7
  # override) supplies them; a case that resolves neither fails loudly.
@@ -11,7 +11,7 @@ suite:
11
11
  description: "The engine's own regression suite: output assertion, tool-trace assertion, and second-model review."
12
12
  models:
13
13
  tiers:
14
- fast: deepseek-v4-flash
14
+ fast: deepseek-flash
15
15
  pro: deepseek-v4-pro
16
16
  concurrency: 1
17
17
  cases:
package/eval/cordis.yml CHANGED
@@ -52,7 +52,7 @@
52
52
  models:
53
53
  - id: deepseek-v4-pro
54
54
  contextWindow: 128000
55
- - id: deepseek-v4-flash
55
+ - id: deepseek-flash
56
56
  contextWindow: 128000
57
57
 
58
58
  # Plain-JSONL session persistence under the report directory: each case's
package/lib/index.js CHANGED
@@ -8,18 +8,30 @@ import { assertObjectJsonSchema } from "@deepseek-ai/dsh-tools";
8
8
  /**
9
9
  * Host-capability detection for the `ignorable` audit-envelope marker.
10
10
  *
11
- * `Session.append(type, data, { ignorable: true })` stamps the envelope
12
- * marker on host builds that expose the surface (post-rc.6
13
- * `@deepseek-ai/dsh-session`); the `0.1.0-rc.6` line silently drops the
14
- * options bag, so audit events land unmarked and stricter hosts refuse to
15
- * resume those sessions (`SessionFormatUnsupportedError`). The published
16
- * `0.1.2-rc.1` and `0.1.3-alpha.2` hosts keep the `ignorable` field on
17
- * the event envelope but offer no append option to write it — the third
18
- * parameter is `SurfaceIntent`, accepted only for surface event types —
19
- * so `append` never stamps the marker there either. The runtime detects the host
20
- * before polluting a log: the installed peer version is checked against
21
- * the known-unmarked lines first, and an unknown (unresolvable) version is
22
- * verified by probing the FIRST appended event's returned envelope. The
11
+ * **No published `@deepseek-ai/dsh-session` can stamp the `ignorable`
12
+ * envelope marker through `append`** — verified three ways on 2026-09-12:
13
+ * the host source (`packages/core/session/src/index.ts:710-738`: the
14
+ * optional third parameter is `SurfaceIntent`, accepted for surface event
15
+ * types only, and the envelope is built from `{ type, seq, time, data }`
16
+ * plus `surfaceOp`/`sourceEventSeqs` alone); every relevant published
17
+ * tarball (`0.1.0-rc.2/3/6/7/8`, `0.1.1-rc.1/2`, `0.1.2-alpha.2–alpha.5`,
18
+ * `0.1.2-rc.1`, `0.1.3-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2` — all build the
19
+ * same envelope); and a live run against the host's own built `Session` on
20
+ * the `0.1.5-rc.2` line, where `append('autoReview/verdict', data,
21
+ * { ignorable: true })` returns an envelope whose keys are exactly
22
+ * `["type","seq","time","data"]`. The marker is reachable only through the
23
+ * seed/restore path, i.e. it is written by the harness that OWNS the log,
24
+ * never by the plugin appending to it (`known-event-types.ts:8-20`).
25
+ *
26
+ * Consequence: an out-of-tree `autoReview/*` event appended on ANY published
27
+ * host lands unmarked, and the persistence read path refuses unknown
28
+ * unmarked types (`session-persistence/src/storage-contract.ts:75`, reached
29
+ * from `session-persistence-jsonl/src/index.ts:627,758`), which makes the
30
+ * session unresumable. The runtime therefore detects the host BEFORE
31
+ * polluting a log: the installed peer version is checked against the
32
+ * known-unmarked lines first, and an unrecognized version is verified by
33
+ * probing the FIRST appended event's returned envelope (that probe is for a
34
+ * FUTURE line that adds the append option — none has shipped). The
23
35
  * same discipline lives in `dsh-permission-rules` (its `AuditAppend` /
24
36
  * `isMarkedAuditEvent` pair).
25
37
  * @module dsh-auto-review/audit
@@ -38,14 +50,14 @@ function isMarkedAuditEvent(result) {
38
50
  }
39
51
  /**
40
52
  * Whether a `@deepseek-ai/dsh-session` version line lacks a safe audit
41
- * write path: every released rc line through `0.1.1-rc.2` silently drops
42
- * the marker from `Session.append` options (no release ever stamps it),
43
- * and the `0.1.2-rc.1` / `0.1.3-alpha.2` / `0.1.5-alpha.1` hosts keep the
44
- * `ignorable` field on the event envelope but have no append option that
45
- * writes it (the third parameter is `SurfaceIntent` for surface event types
46
- * only — the alpha.2 and alpha.5 `append` still assemble the envelope without
47
- * the marker, verified against the published tarballs), so writing
48
- * on those lines still lands an unmarked event. The persistence read path
53
+ * write path. **Every published line lacks one**: no release ever stamps
54
+ * the marker from `Session.append` options (see the module docstring), so
55
+ * a `true` result here is the accurate classification for the whole
56
+ * published 0.1.x range and not an over-reach — do not narrow the bound to
57
+ * "fix" it. The `0.1.6+`/`0.2+` boundary below stays permissive in the
58
+ * other direction on purpose: a future line that adds the append option
59
+ * must be allowed through to the probe. Writing on a `true` line still
60
+ * lands an unmarked event. The persistence read path
49
61
  * fails closed on unmarked unknown event types (`autoReview/*` is not in
50
62
  * `KNOWN_SESSION_EVENT_TYPES` on any published line), so writing there makes
51
63
  * sessions unresumable. Extend the bound when a new line ships that still
@@ -53,10 +65,11 @@ function isMarkedAuditEvent(result) {
53
65
  * unresolvable) versions are treated as possibly-marker-aware and verified
54
66
  * by the append probe.
55
67
  * @param version - the installed peer version string.
56
- * @returns true for the known-unmarked `0.1.0-rc.1–rc.8`, `0.1.1-rc.1–rc.2`,
57
- * and the non-stamping `0.1.2+`/`0.1.3+`/`0.1.5+` prerelease lines
58
- * (`0.1.2-alpha.1` through the published `0.1.2-rc.1`, `0.1.3-alpha.2`, and
59
- * `0.1.5-alpha.1`).
68
+ * @returns true for every published line — the `0.1.0-rc.1–rc.8` and
69
+ * `0.1.1-rc.1–rc.2` rc lines, `0.1.2-alpha.1` through the published
70
+ * `0.1.2-rc.1`, `0.1.3-alpha.2`, and the `0.1.5-alpha.1`/`0.1.5-rc.1`/
71
+ * `0.1.5-rc.2` line (every one of them assembles the append envelope
72
+ * without the marker).
60
73
  */
61
74
  function isUnmarkedHostVersion(version) {
62
75
  const v = version.trim();
@@ -632,7 +645,7 @@ const MESSAGES = {
632
645
  approveNone: (index, count) => `No recent denial #${index} in this session (${count} recorded).`,
633
646
  approveInvalid: (arg) => `Invalid /auto-review approve index "${arg}". Usage: /auto-review approve [n]`,
634
647
  circuitNotice: (kind, count) => `The AI auto-review rejection circuit breaker tripped (${kind}: ${count} denials). This turn is aborted because the agent kept proposing blocked actions. Adjust the sandbox boundary or the review policy, then continue.`,
635
- auditDisabledNotice: "Session-log audit is disabled on this host: its Session.append predates the ignorable marker and unmarked audit events would make sessions unresumable on stricter harness builds. Set allowUnmarkedAudit: true to opt back in, and repair already-polluted logs with scripts/repair-session-logs.mjs from dsh-permission-rules."
648
+ auditDisabledNotice: "Session-log audit is disabled on this host: no published Session.append can write the ignorable marker, and an unmarked audit event makes the session unresumable on any harness that validates stored events. The in-memory mirror keeps budgets and verdicts for this session. allowUnmarkedAudit: true re-enables the log writes and WILL make these sessions unloadable; repair logs already written that way with scripts/repair-session-logs.mjs from dsh-permission-rules."
636
649
  },
637
650
  zh: {
638
651
  usage: "用法:/auto-review on|off|status|approve [n]",
@@ -651,7 +664,7 @@ const MESSAGES = {
651
664
  approveNone: (index, count) => `本会话没有第 ${index} 条近期拒绝记录(共 ${count} 条)。`,
652
665
  approveInvalid: (arg) => `无效的 /auto-review approve 序号 "${arg}"。用法:/auto-review approve [n]`,
653
666
  circuitNotice: (kind, count) => `AI 自动审查拒绝熔断器触发(${kind}:${count} 次拒绝)。由于代理持续提出被阻止的操作,本回合已中止。请调整沙箱边界或审查策略后继续。`,
654
- auditDisabledNotice: "本宿主上会话日志审计已停用:其 Session.append 早于 ignorable 标记支持,未标记的审计事件会使会话在更严格的 harness 构建上无法恢复。设 allowUnmarkedAudit: true 可重新开启;已被污染的历史日志可用 dsh-permission-rules 的 scripts/repair-session-logs.mjs 修复。"
667
+ auditDisabledNotice: "本宿主上会话日志审计已停用:没有任何已发布版本的 Session.append 能写入 ignorable 标记,而未标记的审计事件会让会话在任何校验已存事件的 harness 上无法恢复。本会话的预算与裁决由内存镜像接管。设 allowUnmarkedAudit: true 会恢复日志写入,并会让这些会话无法再次加载;已按此写坏的日志可用 dsh-permission-rules 的 scripts/repair-session-logs.mjs 修复。"
655
668
  }
656
669
  };
657
670
  /**
@@ -6390,7 +6403,7 @@ var AutoReviewRuntime = class AutoReviewRuntime {
6390
6403
  warnUnmarkedAuditHost() {
6391
6404
  if (this.warnedUnmarked) return;
6392
6405
  this.warnedUnmarked = true;
6393
- this.ctx.logger.warn("auto-review: this host drops the ignorable marker on audit events or rejects unknown event types on read (Session.append predates the marker / fail-closed event vocabulary), which would make sessions unresumable — session-log audit is disabled and an in-memory mirror takes over; set allowUnmarkedAudit: true to opt back in, and repair already-polluted logs with scripts/repair-session-logs.mjs from dsh-permission-rules");
6406
+ this.ctx.logger.warn("auto-review: no published Session.append can write the ignorable marker on audit events, and unmarked unknown event types are refused on read, which would make sessions unresumable — session-log audit is disabled and an in-memory mirror takes over. allowUnmarkedAudit: true forces the writes anyway and will make these sessions unloadable; repair logs already written that way with scripts/repair-session-logs.mjs from dsh-permission-rules");
6394
6407
  }
6395
6408
  /** The seq of the open turn/start, or undefined between turns (first-party events exist on every host). */
6396
6409
  openTurnSeq(session) {