@mengyuly/dsh-ponytail 0.3.1 → 0.3.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,363 +1,417 @@
1
- # Changelog
2
-
3
- All notable changes to `@mengyuly/dsh-ponytail` are documented here.
4
- Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
-
1
+ # Changelog
2
+
3
+ All notable changes to `@mengyuly/dsh-ponytail` are documented here.
4
+ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
+
6
6
  ## Unreleased
7
7
 
8
- ## [0.3.1] - 2026-08-26
9
-
10
- ### Changed
11
-
12
- - E2E 规则组补充防误解澄清句:「It does not mean every layer must change:
13
- the change must be complete across the layers it touches.」——防止把
14
- 「最小完整端到端变更」误解为必须修改所有层(真实数据流那条的补充)。
15
- 其余规则文本不变;审计确认 Full/Ultra 的 E2E 组、Lite 架构保护句、
16
- Gain 四段口径、主 Skill 指针卡与 modelInvocable:false、docs smoke
17
- 口径(null≠0/环境阻断/静态vs动态/高方差)均已符合,未重复修改。
18
-
19
- ## [0.3.0] - 2026-08-26
20
-
21
- ### Added
22
-
23
- - **最小正确端到端变更规则**(`instructions.ts` 新增共享 `E2E_RULES` 组,Full
24
- 与 Ultra 均包含):优先「与现有架构兼容的最小完整端到端变更」,而非单个
25
- 文件最少行数;创建组件/抽象/协议/迁移/传输格式/存储格式/依赖前先检查仓库
26
- 既有路径并保留现有契约;任务只要求局部 UI 或行为变化时不得重新设计传输、
27
- 存储、API 形态或持久化;局部更小但改变系统契约的实现并不更小;沿真实数据
28
- 流(input → state → validation → payload → API → persistence →
29
- response/UI)取最小完整变更;不得仅为更小的 diff 留下 UI-only 字段、
30
- 未用状态、占位路径或断开的 payload。
31
- - **Safety 边界扩充**:真实端到端数据流、非平凡改动的必要测试、根因修复
32
- (全模式共享,不可删除)。
33
-
34
- ### Changed
35
-
36
- - **Lite / Full / Ultra 规则边界重定义**(结构化组合保持,恢复旧的
37
- Markdown 正则过滤):
38
- - Lite:完成所有明确要求与验收标准;优先复用/标准库/原生/已装依赖;可
39
- 一句话提示更简方案但不挑战明确要求;**不得仅为减少行数改变现有架构**;
40
- 非平凡改动保留最小合理校验。
41
- - Full:完整七级阶梯;默认最短正确实现并**优先最小完整端到端变更**;偏好
42
- 删除与复用,但不牺牲正确性、安全、测试、明确要求或现有系统契约。
43
- - Ultra:先删后加;主动质疑投机性功能、缓存、抽象、配置、**迁移、传输
44
- 变化、存储变化**与新依赖;**取最小完整端到端变更而非最小局部 diff**;
45
- 不为减少行数改变现有契约;不是无脑拒绝(明确要求/安全/校验/无障碍/
46
- 数据保护/验收标准仍强制)。
47
- - off 仍返回空字符串;同模式输出字节级稳定;三档体积仍远低于旧版 ~1.3k
48
- tokens。
49
- - **`/ponytail-gain` 口径重排**:固定顺序「1. Upstream agentic reference →
50
- 2. Upstream single-shot reference → 3. DSH adapter status → 4. Honesty
51
- boundary」;节省条件补充为「Savings depend on model, workload, prompt
52
- caching, tool usage, and execution path」;诚实边界明确「缺失的 cost
53
- 字段(null)不是 0 成本」。Skill 描述与 Help 表格中的
54
- "less code, less cost, more speed" 改为
55
- "less unnecessary work; token, cost, and latency effects depend on model
56
- and workload"。
57
- - README 顶部定位改为「极简编码原则与相关 Skill 的适配」,明确 DSH 的模型
58
- 循环、Prompt 组装、Skill 机制与工具调用不同。
59
-
60
- ### Tests
61
-
62
- - instructions:Full/Ultra 含端到端规则组;Lite 含架构保护句;三档互异;
63
- off 为空;安全边界含端到端数据流/必要测试/根因修复。
64
- - gain:四段顺序、节省条件、null≠0、无 "less code, less cost, more speed"。
65
-
66
- ## [0.2.2] - 2026-08-26
67
-
68
- ### Changed
69
-
70
- - **`/ponytail-gain` 数据口径修正**:收益数字明确标注为 **Upstream
71
- reference**(Single-shot:5 任务 × 3 Claude 模型,代码 −80~94%、成本
72
- −42~75%、延迟 3.1–5.8×;Agentic:真实 Claude Code 会话 × 12 功能任务,
73
- LOC ~−54%、Token ~−22%、成本 ~−20%、时间 ~−27%、过度构建 −60~94%、
74
- 安全 100%),并注明「These are upstream Ponytail results, not measured
75
- guarantees for this DSH adapter」「Savings depend on model and workload」
76
- 「Already-minimal tasks may show little or no savings」「Some reasoning
77
- models may become more expensive」。新增 **DSH adapter status**:当前
78
- smoke 只支持方向性有效,稳定 Token/成本/延迟节省尚未建立。Skill 描述
79
- 由 "less code, less cost, more speed" 改为 "upstream benchmark reference;
80
- less unnecessary code, while token, cost, and latency effects depend on
81
- model and workload"。
82
- - **主 `ponytail` Skill 自动调用策略**:`invocation` 改为
83
- `modelInvocable: false, userInvocable: true`——指针卡不再进入模型侧
84
- Skill Catalog(普通编码任务不再重复加载),`/ponytail` 等命令与用户侧
85
- 入口不受影响(命令经 `ctx.skills.get` 加载,不被 modelInvocable 门控;
86
- 语义依据 `@deepseek-ai/dsh-skill` 的 `isModelInvocable`/`isUserInvocable`
87
- 与 `tool-skill` 的 Catalog 过滤源码核实)。whenToUse/描述缩小为
88
- 「仅在用户询问激活/模式/配置/帮助时使用」。
89
- - **`/ponytail-help` 模式选择指导**:新增 Lite/Full/Ultra/Off 使用建议
90
- (中英双语)与声明「Ponytail is not a guaranteed token-saving switch. It
91
- trades a small fixed prompt cost for a chance to reduce unnecessary work.
92
- Do not default every task to Ultra.」
93
- - **README 效率说明改为条件性收益**:移除旧的 369/420/406 手工 Token 数字
94
- 与无出处的 A/B 行;改为实测 Prompt 大小(`npm run measure:prompt`)+
95
- 「收益有条件、非保证」说明 + 「上游数据不是本 DSH 适配版的保证」。
96
- - **新增 `docs/dsh-smoke-summary.md`**:DSH Smoke Benchmark 摘要与证据
97
- 边界(环境、三轮结果、Token/成本口径、动态验证阻断、结论分级),
98
- 明确 directional smoke test;不把 runs 原始数据打进 npm 包。
99
-
100
- ### Added
101
-
102
- - **`scripts/measure-prompt.mjs` + `npm run measure:prompt`**:从真实
103
- `getPonytailInstructions()` 生成四档 Prompt,输出 chars/bytes 与
104
- `estimated_tokens`(无统一 tokenizer 时为 null;off 恒为 0),明确
105
- 「rough estimate only; tokenizer and model dependent」,不冒充 Provider
106
- Usage。Node ≥ 22.18(原生 type stripping)。
107
-
108
- ### Fixed
109
-
110
- - `sync:dist` 成功提示文字补上 `src/`(状态检查列表早已覆盖,仅提示遗漏)。
111
- - CHANGELOG 重复的 `## Unreleased` 标题清理;0.2.1 的 Security 内容归档归位。
112
- - 模块顶部注释补齐完整优先级链(会话 override > env > Profile > 用户
113
- config > full),与 modes.ts / content.ts / README / d.ts 一致。
114
-
115
- ### Tests
116
-
117
- - Gain Skill:含 upstream reference、区分 single-shot/agentic、不声称
118
- DSH 适配版保证节省、提示简单任务可能不省与模型差异。
119
- - 主 `ponytail` Skill:仍为指针卡、不含旧 Full 规则;`modelInvocable:
120
- false` / `userInvocable: true`;五个一次性 Skill 的 invocation 不变。
121
- - Prompt:off 为空、三档互不相同、均含安全边界与明确验收项。
122
-
123
- ## [0.2.1] - 2026-08-25
124
-
125
- ### Fixed
126
-
127
- - P1: 主 `ponytail` 技能不再携带旧版 Full 规则集——技能正文改为指向注入段的
128
- **模式感知指针卡**(`PONYTAIL MODE ACTIVE` 段是唯一规则源),Lite/Ultra
129
- 会话里模型不会从技能加载到与当前档位冲突的 Full 规则。
130
- - `/ponytail default` 在「保存值与覆盖源值恰好相同」时(如 env=full 且
131
- `/ponytail default full`)也会点名覆盖来源,不再漏报。
132
- - `sync:dist` 的产物变更状态检查补上 `src/`(0.2.0 起同步 src 镜像)。
133
- - CHANGELOG 章节顺序修正(Unreleased 回到最顶部)。
134
- - README 兼容矩阵文字更新为 Node 22/24。
135
-
136
- ### Changed
137
-
138
- - `/ponytail-help` 补充 Profile 级 `defaultMode` 配置与完整优先级链
139
- (会话 override > env > Profile > 用户 config > full);Ultra 描述改为
140
- 「先删后加、质疑投机,但绝不删明确要求」,与 0.2.0 新语义一致。
141
- - 模块头部注释同步(content.ts / modes.ts)。
142
-
143
- ### Tests
144
-
145
- - ponytail 技能指针卡断言(不含旧 Full 规则)。
146
- - `/ponytail default` 同值覆盖源提示测试。
147
- - 62 tests passed in the authoritative deepseek-harness monorepo package
148
- (`packages/community/ponytail/tests/`: instructions.spec.ts + ponytail.spec.ts;
149
- 本机实测 62 passed;CI 矩阵见 `.github/workflows/ci.yml`,Ubuntu/Windows ×
150
- Node 22/24)。此数字来自权威 monorepo 包测试,不是发行镜像
151
- `verify:dist` / `verify:pack` / `test:consumer` / `test:regressions` 的合计。
152
-
153
- ### Security
154
-
155
- - Documented the development-only `child_process` boundary (`SECURITY.md`):
156
- `scripts/**` is excluded from the npm tarball, has no install lifecycle
157
- hook, and is unreachable from the installed runtime entry.
158
- - Added tarball checks preventing `scripts/` (and `src/`, `tests/`, `test/`,
159
- `tools/`) from being published, plus a post-install assertion that the
160
- installed package contains no `scripts/`.
161
- - Added checks preventing `preinstall` / `install` / `postinstall` /
162
- `prepare` lifecycle hooks from silently invoking development tooling.
163
- - Classified repository-only `child_process` findings as accepted
164
- development-tooling risk.
165
-
166
- ## [0.2.0] - 2026-08-24
167
-
168
- ### Added
169
-
170
- - 真正区分 lite/full/ultra 的 Prompt:从「Markdown 正则过滤同一份正文」改为
171
- **结构化片段组合**(Common 规则 + 永不可删的 Safety 边界 + 各档独立规则)。
172
- - `lite`:完整交付明确要求、可一句话提示更简方案、不挑战明确需求;
173
- - `full`:完整七级阶梯、默认最短正确实现、修根因;
174
- - `ultra`:先删后加、主动质疑投机性功能/缓存/抽象/配置/新依赖、先给最小
175
- 正确版并说明完整版条件、不是无脑拒绝;
176
- - 三档共享 Common + Safety(输入校验/数据丢失防护/安全/无障碍/明确验收项)。
177
- - 常驻注入从 ~1.3k tokens 降到 **lite≈369 / full≈420 / ultra≈406** tokens。
178
- - **Cordis Profile 级 `defaultMode` 配置**:`config: { defaultMode }` 按
179
- profile 生效(`web → full`、`tui → lite` 等),优先级
180
- `会话 override > env > Profile > 用户 config.json > full`;非法值告警一次
181
- 并回退;Profile 配置初始化时读取(Cordis 无公开配置变更事件),重启生效;
182
- `/ponytail default` 的 saved/effective 提示现在会点名覆盖来源
183
- (`PONYTAIL_DEFAULT_MODE` / `profile configuration`)。
184
- - 兼容矩阵:CI 扩展为 **Node 22 × Node 24 × ubuntu × windows**(4 组合);
185
- `dist-provenance.json` 增加 `generatedBy.cordis`;README 记录实测矩阵
186
- (含 web profile 本机验证、tui/headless 如实标注未验证)。
187
- - 结构化 Prompt 的行为测试、快照测试、token 统计测试;Profile 优先级测试
188
- (env>profile、会话 override>env、非法回退、双 profile 不同默认)。
189
-
190
- ### Changed
191
-
192
- - 默认模式解析加入 Profile 档(代码/测试/README 三处一致)。
193
- - README:三档真实差异、Profile 配置示例、兼容矩阵、子代理边界表述。
194
-
195
- ### Fixed
196
-
197
- - 删除随旧实现遗留的 `filterSkillBodyForMode` 正则过滤路径及其测试
198
- (被结构化组合取代)。
199
-
200
- ### Security
201
-
202
- - 无变化(0.1.6 的 eval-free 产物与 dev-tooling 边界保持)。
203
- ## [0.1.6] - 2026-08-24
204
-
205
- ### Fixed
206
-
207
- - 移除发行产物中的动态代码执行:`new Function` 的调用点来自内联进 bundle 的
208
- schemastery(其 schema DSL 会把字符串 `callback` 编译成函数)。已把
209
- `@deepseek-ai/schemastery` 从 bundle **外置**为已发布的 peer(与 cordis
210
- 同等对待),发行 `lib/index.js` 不再包含任何 `new Function` / `eval`
211
- (CI 的 `check-bundle` 现在断言外链集合精确为
212
- `cordis + schemastery`,且产物零动态执行)。该调用点在本插件运行时路径上
213
- 本不可达(只构造、不解析),外置是消除扫描告警的根治,也是更诚实的依赖声明。
214
-
215
- ### Changed
216
-
217
- - 运行时依赖表述更新:bundle 现在 import `@deepseek-ai/cordis` +
218
- `@deepseek-ai/schemastery`(两者都已发布);`dsh-llm` / `dsh-skill` 仍内联
219
- (npm 无兼容版本)。
220
- - `@deepseek-ai/schemastery` 加入 peerDependencies(宿主兼容声明)。
221
- - `verify-dist` 的运行时导出检查改用链式可调用 stub 加载 bundle
222
- (schemastery 在模块加载时被急切构建 schema,但本插件路径不解析它们)。
223
- - 移除只做类型检查、职责与 `sync:dist` 重叠的 `scripts/build.sh`。
224
-
225
- ### Tests
226
-
227
- - Ubuntu + Windows(CI 矩阵):check-bundle(外链白名单 + 零动态执行)、
228
- verify:dist、verify:pack、test:consumer、test:regressions。
229
- - tarball 安装 smoke 现在显式安装 cordis + schemastery 两个运行时 peer。
230
-
231
- ## [0.1.5] - 2026-08-24
232
-
233
- ### Fixed
234
-
235
- - Windows 下验证脚本无法启动 `npm.cmd`:`spawnSync('npm', …)` 在 Windows 上对
236
- `.cmd` 无效(`status === null`)。现在统一走 `process.execPath + npm_execpath`
237
- (npm script 环境内为 npm 自身 CLI,跨平台可靠),并在 `npm_execpath` 缺失或
238
- 指向其他包管理器(pnpm/yarn/bun shim)时回退到 `npm`/`npm.cmd`。
239
- - `spawnSync` 启动失败时错误信息丢失:统一 `formatSpawnFailure` 输出 command、
240
- args、cwd、status、signal、`result.error.message`、stdout/stderr 尾部
241
- (各 4KB 上限);`status === null` 明确判为启动失败或被信号终止,不再显示为
242
- 普通退出码。
243
- - `verify-dist` 不再有未定义 `existsSync` 的潜伏分支:改为**直接拒绝**任何
244
- `sourceMappingURL`(与 v0.1.4 起 `declarationMap: false` 的发布策略一致),
245
- 并新增回归测试证明声明文件重现 source map 时验证会明确失败。
246
- - 删除 CI 中 checkout 后立即执行的无效 `git diff --exit-code -- lib` 步骤
247
- (工作区天然干净,证明不了任何事);防漂移表述与真实能力对齐。
248
-
249
- ### Changed
250
-
251
- - `verify-pack` / `test-consumer` 共用 `scripts/lib/run-command.mjs` 跨平台进程
252
- 工具,不再各自维护一套 `spawnSync('npm', …)`。
253
- - `verify-pack` 如实报告实际安装的依赖(npm 会解析全部声明 peers,包括宿主
254
- 契约 peers;bundle 运行时只 import `@deepseek-ai/cordis` 由独立外链检查证明)。
255
- - CI 增加 Windows Runner(`windows-latest` + `ubuntu-latest` 矩阵,Node 24,
256
- 不允许跳过或 continue-on-error)。
257
- - `sync:dist` 生成 `dist-provenance.json`:`sourceCommit` 来自权威 checkout 的
258
- `git rev-parse HEAD`(真实 SHA,不手工填写),工具链版本取自 checkout 的
259
- node_modules,不含本机绝对路径;`verify:dist` 校验其格式。
260
- - tarball 现在包含 `dist-provenance.json`。
261
- - 产物一致性检查命名与真实能力一致:`verify:dist` 是静态一致性检查(src/d.ts
262
- 导出、关键签名、主入口运行时导出、无 source map、provenance),不是与权威
263
- 构建的字节级等价证明。
264
-
265
- ### Tests
266
-
267
- - Ubuntu:verify:dist / verify:pack / test:consumer / test:regressions 全部通过。
268
- - Windows:CI 矩阵真实执行 verify:dist / verify:pack / test:consumer。
269
- - npm tarball smoke(仅声明依赖安装后加载)。
270
- - NodeNext + skipLibCheck:false consumer。
271
- - 子进程启动失败诊断回归测试。
272
- - declaration source map 回归测试。
273
-
274
- ## [0.1.4] - 2026-08-24
275
-
276
- ### Fixed
277
-
278
- - 修复运行时 JS 与 TypeScript declarations 不一致:v0.1.3 只同步了
279
- `lib/index.js`/`lib/invariant.js`,声明文件停留在旧版本。
280
- - `compileSubagentMatcher` 声明恢复正确(`{ matcher, invalid }`),与运行时一致。
281
- - 补齐 `readDefaultModeInfo`、`sessionKey` 及诊断类型
282
- (`DefaultModeIssueKind` / `DefaultModeIssue` / `DefaultModeResolution`)的声明。
283
- - `writeDefaultMode` 声明注释补充「写入失败会抛出异常」。
284
- - 移除失效的 declaration source map 引用:声明生成关闭 `declarationMap`,
285
- 发布的 `.d.ts` 不再携带指向不存在 `.d.ts.map` 的 `sourceMappingURL`。
8
+ ## [0.3.3] - 2026-09-09
286
9
 
287
10
  ### Changed
288
11
 
289
- - 发布流程改为同步**完整** `lib/`(两个运行时 bundle + 全部 `.d.ts`):
290
- `npm run sync:dist`(要求 `DSH_CHECKOUT`,在权威 checkout 中重建后整体同步)。
291
- - CI 增加防漂移检查:src 导出 声明导出、运行时导出 声明导出、
292
- `modes.d.ts` 关键签名、无悬空 source map、tarball 内容/版本/安装后 smoke、
293
- NodeNext + `skipLibCheck:false` 的声明消费测试。
294
- - tarball 现在包含 `CHANGELOG.md`。
295
-
296
- ### Tests
297
-
298
- - npm tarball smoke test(仅声明 peer 安装后加载)。
299
- - TypeScript consumer test(打包安装后编译,非相对路径读 src)。
300
- - 运行时/声明导出一致性验证。
301
- - src↔d.ts 漂移检查(CI 与 `verify:dist` 双保险)。
302
-
303
- ## [0.1.3] - 2026-08-23
12
+ - Reworked the always-on rules into an outcome-driven execution loop: define
13
+ observable completion, resolve uncertainty from evidence, make the smallest
14
+ complete change, run the narrowest relevant check, inspect the final diff,
15
+ and report only verified results. Lite now emphasizes direct execution;
16
+ Ultra requires evidence before adding code. Restored upstream's guard that
17
+ non-trivial logic leaves exactly one minimal runnable check, without adding
18
+ a test framework or fixtures, and made the ladder a reflex rather than a
19
+ research project. All three prompts remain below their previous byte sizes.
304
20
 
305
21
  ### Fixed
306
22
 
307
- - Bare `/ponytail` on an `off` session now re-enables at the effective default
308
- (or `full` when that default is `off` too), matching the documented "resume
309
- anytime with `/ponytail`" behavior. It still only reports when already enabled.
310
- - `/ponytail default <mode>` no longer bypasses `PONYTAIL_DEFAULT_MODE`: the
311
- effective default is recomputed after the write, so the env var keeps its
312
- documented highest priority; the result distinguishes saved vs effective.
313
- - Typo: `Ponyytail default set` `Ponytail default set`.
314
- - Deactivation phrases now also strip CJK sentence enders (`。?!`), so
315
- `normal mode?` and `stop ponytail。` deactivate as expected.
316
- - Config writes are now atomic (temp file + rename); a failed write returns an
317
- error instead of a false success.
318
- - A temporarily invalid config during hot-reload keeps the last known good
319
- default instead of snapping back to `full`.
320
-
321
- ### Changed
322
-
323
- - `/ponytail status` added as a pure query (never modifies the session).
324
- - Command hints and error text updated to the new surface
325
- (`[status|default <mode>|lite|full|ultra|off]`).
326
- - Invalid config JSON / `defaultMode` / read failures and invalid
327
- `PONYTAIL_SUBAGENT_MATCHER` now warn exactly once (fail-open preserved,
328
- missing config file stays silent).
329
- - Session identity is centralized in one `sessionKey(agent)` helper; mode
330
- overrides are released on `agent/disposed`, so long-running hosts do not
331
- accumulate stale per-session entries.
332
-
333
- ### Tests
334
-
335
- - 47 unit/integration tests (was 24): command semantics (bare `/ponytail`
336
- restore paths, `status`, `default` saved-vs-effective, write failure),
337
- priority (env > config > full, invalid env falls back to config),
338
- session isolation and disposal cleanup, CJK/ASCII deactivation punctuation,
339
- config file edge cases (BOM, empty, invalid JSON, array root, unknown-field
340
- preservation, atomic write), hot-reload keep-last-good, and a headless
341
- (no command plane) mount.
342
-
343
- ## [0.1.2] - 2026-08-23
344
-
345
- ### Changed
346
-
347
- - Self-contained bundle: `dsh-llm` / `dsh-skill` are inlined, so the runtime
348
- only depends on the `@deepseek-ai/cordis` peer — installable from GitHub,
349
- tarball, or npm without a dsh source tree.
350
- - npm scope renamed to `@mengyuly/dsh-ponytail` (matches the npm account).
351
-
352
- ### Tests
353
-
354
- - CI smoke verifies the bundle leaves no dsh core external and loads with only
355
- cordis installed.
356
-
357
- ## [0.1.0] - 2026-08-23
358
-
359
- ### Added
360
-
361
- - Initial release: always-on lazy-senior-developer ruleset, lite/full/ultra/off
362
- intensities, six skills and slash commands, deactivation phrases,
363
- `PONYTAIL_DEFAULT_MODE` / config-file defaults, subagent matcher.
23
+ - Improved the surrounding controls and one-shot skills: Chinese whole-message
24
+ deactivation is supported; review and audit
25
+ findings require observable code evidence; debt scans exclude generated
26
+ trees; `/ponytail reset` restores the configured default; status reports
27
+ whether the current mode is a session override or configured default.
28
+ - Added a core behavior gate that locks prompt bytes, safety invariants,
29
+ deactivation behavior, runtime skill surface, and shipped-bundle markers.
30
+ - Removed the Windows `npm.cmd` shell fallback from verification tooling;
31
+ npm now runs through the active Node executable without shell argument
32
+ concatenation or Node's `DEP0190` warning.
33
+ - Clarified that repository verification and release scripts are maintainer-only
34
+ and are intentionally excluded from the npm tarball.
35
+ - Prevented the published package from exposing maintenance commands that are
36
+ unavailable after installation (`package.json` no longer carries the
37
+ `scripts/`-based commands; maintainers use `node scripts/<script>.mjs` with
38
+ the `package.dev.json` command list).
39
+ - Added a regression check for the published package boundary
40
+ (no `scripts/` exposure, no install lifecycle hooks, entry targets exist).
41
+ - Updated the fixed-version Release example to v0.3.2 while keeping the
42
+ stable versionless latest asset URL.
43
+ - Added cross-channel release consistency checks for Git Tag, npm,
44
+ GitHub Release assets, tarball contents, and dist provenance.
45
+ - Prevented stale local checkouts from being reported as validation of the
46
+ currently published version.
47
+
48
+ ## [0.3.2] - 2026-08-31
49
+
50
+ ### Changed
51
+
52
+ - Compressed the structured Lite/Full/Ultra prompt by merging shared end-to-end,
53
+ contract-preservation, disconnected-payload, and proportional-investigation rules;
54
+ the safety boundaries and Full seven-rung ladder remain intact. Lite also keeps
55
+ its non-challenge boundary and proportional investigation rule.
56
+ - Fixed the version-pinned GitHub Release example to use the asset name actually
57
+ published by v0.3.1; release-link verification now rejects unpublished
58
+ versioned asset names.
59
+ - Fixed invariant package-name synchronization and added a distribution guard;
60
+ normalized source file modes for publishable metadata.
61
+
62
+ ## [0.3.1] - 2026-08-26
63
+
64
+ ### Changed
65
+
66
+ - E2E 规则组补充防误解澄清句:「It does not mean every layer must change:
67
+ the change must be complete across the layers it touches.」——防止把
68
+ 「最小完整端到端变更」误解为必须修改所有层(真实数据流那条的补充)。
69
+ 其余规则文本不变;审计确认 Full/Ultra 的 E2E 组、Lite 架构保护句、
70
+ Gain 四段口径、主 Skill 指针卡与 modelInvocable:false、docs smoke
71
+ 口径(null≠0/环境阻断/静态vs动态/高方差)均已符合,未重复修改。
72
+
73
+ ## [0.3.0] - 2026-08-26
74
+
75
+ ### Added
76
+
77
+ - **最小正确端到端变更规则**(`instructions.ts` 新增共享 `E2E_RULES` 组,Full
78
+ Ultra 均包含):优先「与现有架构兼容的最小完整端到端变更」,而非单个
79
+ 文件最少行数;创建组件/抽象/协议/迁移/传输格式/存储格式/依赖前先检查仓库
80
+ 既有路径并保留现有契约;任务只要求局部 UI 或行为变化时不得重新设计传输、
81
+ 存储、API 形态或持久化;局部更小但改变系统契约的实现并不更小;沿真实数据
82
+ 流(input → state → validation → payload → API → persistence →
83
+ response/UI)取最小完整变更;不得仅为更小的 diff 留下 UI-only 字段、
84
+ 未用状态、占位路径或断开的 payload。
85
+ - **Safety 边界扩充**:真实端到端数据流、非平凡改动的必要测试、根因修复
86
+ (全模式共享,不可删除)。
87
+
88
+ ### Changed
89
+
90
+ - **Lite / Full / Ultra 规则边界重定义**(结构化组合保持,恢复旧的
91
+ Markdown 正则过滤):
92
+ - Lite:完成所有明确要求与验收标准;优先复用/标准库/原生/已装依赖;可
93
+ 一句话提示更简方案但不挑战明确要求;**不得仅为减少行数改变现有架构**;
94
+ 非平凡改动保留最小合理校验。
95
+ - Full:完整七级阶梯;默认最短正确实现并**优先最小完整端到端变更**;偏好
96
+ 删除与复用,但不牺牲正确性、安全、测试、明确要求或现有系统契约。
97
+ - Ultra:先删后加;主动质疑投机性功能、缓存、抽象、配置、**迁移、传输
98
+ 变化、存储变化**与新依赖;**取最小完整端到端变更而非最小局部 diff**;
99
+ 不为减少行数改变现有契约;不是无脑拒绝(明确要求/安全/校验/无障碍/
100
+ 数据保护/验收标准仍强制)。
101
+ - off 仍返回空字符串;同模式输出字节级稳定;三档体积仍远低于旧版 ~1.3k
102
+ tokens。
103
+ - **`/ponytail-gain` 口径重排**:固定顺序「1. Upstream agentic reference →
104
+ 2. Upstream single-shot reference → 3. DSH adapter status → 4. Honesty
105
+ boundary」;节省条件补充为「Savings depend on model, workload, prompt
106
+ caching, tool usage, and execution path」;诚实边界明确「缺失的 cost
107
+ 字段(null)不是 0 成本」。Skill 描述与 Help 表格中的
108
+ "less code, less cost, more speed" 改为
109
+ "less unnecessary work; token, cost, and latency effects depend on model
110
+ and workload"。
111
+ - README 顶部定位改为「极简编码原则与相关 Skill 的适配」,明确 DSH 的模型
112
+ 循环、Prompt 组装、Skill 机制与工具调用不同。
113
+
114
+ ### Tests
115
+
116
+ - instructions:Full/Ultra 含端到端规则组;Lite 含架构保护句;三档互异;
117
+ off 为空;安全边界含端到端数据流/必要测试/根因修复。
118
+ - gain:四段顺序、节省条件、null≠0、无 "less code, less cost, more speed"。
119
+
120
+ ## [0.2.2] - 2026-08-26
121
+
122
+ ### Changed
123
+
124
+ - **`/ponytail-gain` 数据口径修正**:收益数字明确标注为 **Upstream
125
+ reference**(Single-shot:5 任务 × 3 Claude 模型,代码 −80~94%、成本
126
+ −42~75%、延迟 3.1–5.8×;Agentic:真实 Claude Code 会话 × 12 功能任务,
127
+ LOC ~−54%、Token ~−22%、成本 ~−20%、时间 ~−27%、过度构建 −60~94%、
128
+ 安全 100%),并注明「These are upstream Ponytail results, not measured
129
+ guarantees for this DSH adapter」「Savings depend on model and workload」
130
+ 「Already-minimal tasks may show little or no savings」「Some reasoning
131
+ models may become more expensive」。新增 **DSH adapter status**:当前
132
+ smoke 只支持方向性有效,稳定 Token/成本/延迟节省尚未建立。Skill 描述
133
+ 由 "less code, less cost, more speed" 改为 "upstream benchmark reference;
134
+ less unnecessary code, while token, cost, and latency effects depend on
135
+ model and workload"。
136
+ - **主 `ponytail` Skill 自动调用策略**:`invocation` 改为
137
+ `modelInvocable: false, userInvocable: true`——指针卡不再进入模型侧
138
+ Skill Catalog(普通编码任务不再重复加载),`/ponytail` 等命令与用户侧
139
+ 入口不受影响(命令经 `ctx.skills.get` 加载,不被 modelInvocable 门控;
140
+ 语义依据 `@deepseek-ai/dsh-skill` 的 `isModelInvocable`/`isUserInvocable`
141
+ 与 `tool-skill` 的 Catalog 过滤源码核实)。whenToUse/描述缩小为
142
+ 「仅在用户询问激活/模式/配置/帮助时使用」。
143
+ - **`/ponytail-help` 模式选择指导**:新增 Lite/Full/Ultra/Off 使用建议
144
+ (中英双语)与声明「Ponytail is not a guaranteed token-saving switch. It
145
+ trades a small fixed prompt cost for a chance to reduce unnecessary work.
146
+ Do not default every task to Ultra.」
147
+ - **README 效率说明改为条件性收益**:移除旧的 369/420/406 手工 Token 数字
148
+ 与无出处的 A/B 行;改为实测 Prompt 大小(`npm run measure:prompt`)+
149
+ 「收益有条件、非保证」说明 + 「上游数据不是本 DSH 适配版的保证」。
150
+ - **新增 `docs/dsh-smoke-summary.md`**:DSH Smoke Benchmark 摘要与证据
151
+ 边界(环境、三轮结果、Token/成本口径、动态验证阻断、结论分级),
152
+ 明确 directional smoke test;不把 runs 原始数据打进 npm 包。
153
+
154
+ ### Added
155
+
156
+ - **`scripts/measure-prompt.mjs` + `npm run measure:prompt`**:从真实
157
+ `getPonytailInstructions()` 生成四档 Prompt,输出 chars/bytes 与
158
+ `estimated_tokens`(无统一 tokenizer 时为 null;off 恒为 0),明确
159
+ 「rough estimate only; tokenizer and model dependent」,不冒充 Provider
160
+ Usage。Node ≥ 22.18(原生 type stripping)。
161
+
162
+ ### Fixed
163
+
164
+ - `sync:dist` 成功提示文字补上 `src/`(状态检查列表早已覆盖,仅提示遗漏)。
165
+ - CHANGELOG 重复的 `## Unreleased` 标题清理;0.2.1 的 Security 内容归档归位。
166
+ - 模块顶部注释补齐完整优先级链(会话 override > env > Profile > 用户
167
+ config > full),与 modes.ts / content.ts / README / d.ts 一致。
168
+
169
+ ### Tests
170
+
171
+ - Gain Skill:含 upstream reference、区分 single-shot/agentic、不声称
172
+ DSH 适配版保证节省、提示简单任务可能不省与模型差异。
173
+ - 主 `ponytail` Skill:仍为指针卡、不含旧 Full 规则;`modelInvocable:
174
+ false` / `userInvocable: true`;五个一次性 Skill 的 invocation 不变。
175
+ - Prompt:off 为空、三档互不相同、均含安全边界与明确验收项。
176
+
177
+ ## [0.2.1] - 2026-08-25
178
+
179
+ ### Fixed
180
+
181
+ - P1: 主 `ponytail` 技能不再携带旧版 Full 规则集——技能正文改为指向注入段的
182
+ **模式感知指针卡**(`PONYTAIL MODE ACTIVE` 段是唯一规则源),Lite/Ultra
183
+ 会话里模型不会从技能加载到与当前档位冲突的 Full 规则。
184
+ - `/ponytail default` 在「保存值与覆盖源值恰好相同」时(如 env=full 且
185
+ `/ponytail default full`)也会点名覆盖来源,不再漏报。
186
+ - `sync:dist` 的产物变更状态检查补上 `src/`(0.2.0 起同步 src 镜像)。
187
+ - CHANGELOG 章节顺序修正(Unreleased 回到最顶部)。
188
+ - README 兼容矩阵文字更新为 Node 22/24。
189
+
190
+ ### Changed
191
+
192
+ - `/ponytail-help` 补充 Profile 级 `defaultMode` 配置与完整优先级链
193
+ (会话 override > env > Profile > 用户 config > full);Ultra 描述改为
194
+ 「先删后加、质疑投机,但绝不删明确要求」,与 0.2.0 新语义一致。
195
+ - 模块头部注释同步(content.ts / modes.ts)。
196
+
197
+ ### Tests
198
+
199
+ - ponytail 技能指针卡断言(不含旧 Full 规则)。
200
+ - `/ponytail default` 同值覆盖源提示测试。
201
+ - 62 tests passed in the authoritative deepseek-harness monorepo package
202
+ (`packages/community/ponytail/tests/`: instructions.spec.ts + ponytail.spec.ts;
203
+ 本机实测 62 passed;CI 矩阵见 `.github/workflows/ci.yml`,Ubuntu/Windows ×
204
+ Node 22/24)。此数字来自权威 monorepo 包测试,不是发行镜像
205
+ `verify:dist` / `verify:pack` / `test:consumer` / `test:regressions` 的合计。
206
+
207
+ ### Security
208
+
209
+ - Documented the development-only `child_process` boundary (`SECURITY.md`):
210
+ `scripts/**` is excluded from the npm tarball, has no install lifecycle
211
+ hook, and is unreachable from the installed runtime entry.
212
+ - Added tarball checks preventing `scripts/` (and `src/`, `tests/`, `test/`,
213
+ `tools/`) from being published, plus a post-install assertion that the
214
+ installed package contains no `scripts/`.
215
+ - Added checks preventing `preinstall` / `install` / `postinstall` /
216
+ `prepare` lifecycle hooks from silently invoking development tooling.
217
+ - Classified repository-only `child_process` findings as accepted
218
+ development-tooling risk.
219
+
220
+ ## [0.2.0] - 2026-08-24
221
+
222
+ ### Added
223
+
224
+ - 真正区分 lite/full/ultra 的 Prompt:从「Markdown 正则过滤同一份正文」改为
225
+ **结构化片段组合**(Common 规则 + 永不可删的 Safety 边界 + 各档独立规则)。
226
+ - `lite`:完整交付明确要求、可一句话提示更简方案、不挑战明确需求;
227
+ - `full`:完整七级阶梯、默认最短正确实现、修根因;
228
+ - `ultra`:先删后加、主动质疑投机性功能/缓存/抽象/配置/新依赖、先给最小
229
+ 正确版并说明完整版条件、不是无脑拒绝;
230
+ - 三档共享 Common + Safety(输入校验/数据丢失防护/安全/无障碍/明确验收项)。
231
+ - 常驻注入从 ~1.3k tokens 降到 **lite≈369 / full≈420 / ultra≈406** tokens。
232
+ - **Cordis Profile 级 `defaultMode` 配置**:`config: { defaultMode }` 按
233
+ profile 生效(`web → full`、`tui → lite` 等),优先级
234
+ `会话 override > env > Profile > 用户 config.json > full`;非法值告警一次
235
+ 并回退;Profile 配置初始化时读取(Cordis 无公开配置变更事件),重启生效;
236
+ `/ponytail default` 的 saved/effective 提示现在会点名覆盖来源
237
+ (`PONYTAIL_DEFAULT_MODE` / `profile configuration`)。
238
+ - 兼容矩阵:CI 扩展为 **Node 22 × Node 24 × ubuntu × windows**(4 组合);
239
+ `dist-provenance.json` 增加 `generatedBy.cordis`;README 记录实测矩阵
240
+ (含 web profile 本机验证、tui/headless 如实标注未验证)。
241
+ - 结构化 Prompt 的行为测试、快照测试、token 统计测试;Profile 优先级测试
242
+ (env>profile、会话 override>env、非法回退、双 profile 不同默认)。
243
+
244
+ ### Changed
245
+
246
+ - 默认模式解析加入 Profile 档(代码/测试/README 三处一致)。
247
+ - README:三档真实差异、Profile 配置示例、兼容矩阵、子代理边界表述。
248
+
249
+ ### Fixed
250
+
251
+ - 删除随旧实现遗留的 `filterSkillBodyForMode` 正则过滤路径及其测试
252
+ (被结构化组合取代)。
253
+
254
+ ### Security
255
+
256
+ - 无变化(0.1.6 的 eval-free 产物与 dev-tooling 边界保持)。
257
+ ## [0.1.6] - 2026-08-24
258
+
259
+ ### Fixed
260
+
261
+ - 移除发行产物中的动态代码执行:`new Function` 的调用点来自内联进 bundle 的
262
+ schemastery(其 schema DSL 会把字符串 `callback` 编译成函数)。已把
263
+ `@deepseek-ai/schemastery` 从 bundle **外置**为已发布的 peer(与 cordis
264
+ 同等对待),发行 `lib/index.js` 不再包含任何 `new Function` / `eval`
265
+ (CI 的 `check-bundle` 现在断言外链集合精确为
266
+ `cordis + schemastery`,且产物零动态执行)。该调用点在本插件运行时路径上
267
+ 本不可达(只构造、不解析),外置是消除扫描告警的根治,也是更诚实的依赖声明。
268
+
269
+ ### Changed
270
+
271
+ - 运行时依赖表述更新:bundle 现在 import `@deepseek-ai/cordis` +
272
+ `@deepseek-ai/schemastery`(两者都已发布);`dsh-llm` / `dsh-skill` 仍内联
273
+ (npm 无兼容版本)。
274
+ - `@deepseek-ai/schemastery` 加入 peerDependencies(宿主兼容声明)。
275
+ - `verify-dist` 的运行时导出检查改用链式可调用 stub 加载 bundle
276
+ (schemastery 在模块加载时被急切构建 schema,但本插件路径不解析它们)。
277
+ - 移除只做类型检查、职责与 `sync:dist` 重叠的 `scripts/build.sh`。
278
+
279
+ ### Tests
280
+
281
+ - Ubuntu + Windows(CI 矩阵):check-bundle(外链白名单 + 零动态执行)、
282
+ verify:dist、verify:pack、test:consumer、test:regressions。
283
+ - tarball 安装 smoke 现在显式安装 cordis + schemastery 两个运行时 peer。
284
+
285
+ ## [0.1.5] - 2026-08-24
286
+
287
+ ### Fixed
288
+
289
+ - Windows 下验证脚本无法启动 `npm.cmd`:`spawnSync('npm', …)` 在 Windows 上对
290
+ `.cmd` 无效(`status === null`)。现在统一走 `process.execPath + npm_execpath`
291
+ (npm script 环境内为 npm 自身 CLI,跨平台可靠),并在 `npm_execpath` 缺失或
292
+ 指向其他包管理器(pnpm/yarn/bun shim)时回退到 `npm`/`npm.cmd`。
293
+ - `spawnSync` 启动失败时错误信息丢失:统一 `formatSpawnFailure` 输出 command、
294
+ args、cwd、status、signal、`result.error.message`、stdout/stderr 尾部
295
+ (各 4KB 上限);`status === null` 明确判为启动失败或被信号终止,不再显示为
296
+ 普通退出码。
297
+ - `verify-dist` 不再有未定义 `existsSync` 的潜伏分支:改为**直接拒绝**任何
298
+ `sourceMappingURL`(与 v0.1.4 起 `declarationMap: false` 的发布策略一致),
299
+ 并新增回归测试证明声明文件重现 source map 时验证会明确失败。
300
+ - 删除 CI 中 checkout 后立即执行的无效 `git diff --exit-code -- lib` 步骤
301
+ (工作区天然干净,证明不了任何事);防漂移表述与真实能力对齐。
302
+
303
+ ### Changed
304
+
305
+ - `verify-pack` / `test-consumer` 共用 `scripts/lib/run-command.mjs` 跨平台进程
306
+ 工具,不再各自维护一套 `spawnSync('npm', …)`。
307
+ - `verify-pack` 如实报告实际安装的依赖(npm 会解析全部声明 peers,包括宿主
308
+ 契约 peers;bundle 运行时只 import `@deepseek-ai/cordis` 由独立外链检查证明)。
309
+ - CI 增加 Windows Runner(`windows-latest` + `ubuntu-latest` 矩阵,Node 24,
310
+ 不允许跳过或 continue-on-error)。
311
+ - `sync:dist` 生成 `dist-provenance.json`:`sourceCommit` 来自权威 checkout 的
312
+ `git rev-parse HEAD`(真实 SHA,不手工填写),工具链版本取自 checkout 的
313
+ node_modules,不含本机绝对路径;`verify:dist` 校验其格式。
314
+ - tarball 现在包含 `dist-provenance.json`。
315
+ - 产物一致性检查命名与真实能力一致:`verify:dist` 是静态一致性检查(src/d.ts
316
+ 导出、关键签名、主入口运行时导出、无 source map、provenance),不是与权威
317
+ 构建的字节级等价证明。
318
+
319
+ ### Tests
320
+
321
+ - Ubuntu:verify:dist / verify:pack / test:consumer / test:regressions 全部通过。
322
+ - Windows:CI 矩阵真实执行 verify:dist / verify:pack / test:consumer。
323
+ - npm tarball smoke(仅声明依赖安装后加载)。
324
+ - NodeNext + skipLibCheck:false consumer。
325
+ - 子进程启动失败诊断回归测试。
326
+ - declaration source map 回归测试。
327
+
328
+ ## [0.1.4] - 2026-08-24
329
+
330
+ ### Fixed
331
+
332
+ - 修复运行时 JS 与 TypeScript declarations 不一致:v0.1.3 只同步了
333
+ `lib/index.js`/`lib/invariant.js`,声明文件停留在旧版本。
334
+ - `compileSubagentMatcher` 声明恢复正确(`{ matcher, invalid }`),与运行时一致。
335
+ - 补齐 `readDefaultModeInfo`、`sessionKey` 及诊断类型
336
+ (`DefaultModeIssueKind` / `DefaultModeIssue` / `DefaultModeResolution`)的声明。
337
+ - `writeDefaultMode` 声明注释补充「写入失败会抛出异常」。
338
+ - 移除失效的 declaration source map 引用:声明生成关闭 `declarationMap`,
339
+ 发布的 `.d.ts` 不再携带指向不存在 `.d.ts.map` 的 `sourceMappingURL`。
340
+
341
+ ### Changed
342
+
343
+ - 发布流程改为同步**完整** `lib/`(两个运行时 bundle + 全部 `.d.ts`):
344
+ `npm run sync:dist`(要求 `DSH_CHECKOUT`,在权威 checkout 中重建后整体同步)。
345
+ - CI 增加防漂移检查:src 导出 ↔ 声明导出、运行时导出 ↔ 声明导出、
346
+ `modes.d.ts` 关键签名、无悬空 source map、tarball 内容/版本/安装后 smoke、
347
+ NodeNext + `skipLibCheck:false` 的声明消费测试。
348
+ - tarball 现在包含 `CHANGELOG.md`。
349
+
350
+ ### Tests
351
+
352
+ - npm tarball smoke test(仅声明 peer 安装后加载)。
353
+ - TypeScript consumer test(打包安装后编译,非相对路径读 src)。
354
+ - 运行时/声明导出一致性验证。
355
+ - src↔d.ts 漂移检查(CI 与 `verify:dist` 双保险)。
356
+
357
+ ## [0.1.3] - 2026-08-23
358
+
359
+ ### Fixed
360
+
361
+ - Bare `/ponytail` on an `off` session now re-enables at the effective default
362
+ (or `full` when that default is `off` too), matching the documented "resume
363
+ anytime with `/ponytail`" behavior. It still only reports when already enabled.
364
+ - `/ponytail default <mode>` no longer bypasses `PONYTAIL_DEFAULT_MODE`: the
365
+ effective default is recomputed after the write, so the env var keeps its
366
+ documented highest priority; the result distinguishes saved vs effective.
367
+ - Typo: `Ponyytail default set` → `Ponytail default set`.
368
+ - Deactivation phrases now also strip CJK sentence enders (`。?!`), so
369
+ `normal mode?` and `stop ponytail。` deactivate as expected.
370
+ - Config writes are now atomic (temp file + rename); a failed write returns an
371
+ error instead of a false success.
372
+ - A temporarily invalid config during hot-reload keeps the last known good
373
+ default instead of snapping back to `full`.
374
+
375
+ ### Changed
376
+
377
+ - `/ponytail status` added as a pure query (never modifies the session).
378
+ - Command hints and error text updated to the new surface
379
+ (`[status|default <mode>|lite|full|ultra|off]`).
380
+ - Invalid config JSON / `defaultMode` / read failures and invalid
381
+ `PONYTAIL_SUBAGENT_MATCHER` now warn exactly once (fail-open preserved,
382
+ missing config file stays silent).
383
+ - Session identity is centralized in one `sessionKey(agent)` helper; mode
384
+ overrides are released on `agent/disposed`, so long-running hosts do not
385
+ accumulate stale per-session entries.
386
+
387
+ ### Tests
388
+
389
+ - 47 unit/integration tests (was 24): command semantics (bare `/ponytail`
390
+ restore paths, `status`, `default` saved-vs-effective, write failure),
391
+ priority (env > config > full, invalid env falls back to config),
392
+ session isolation and disposal cleanup, CJK/ASCII deactivation punctuation,
393
+ config file edge cases (BOM, empty, invalid JSON, array root, unknown-field
394
+ preservation, atomic write), hot-reload keep-last-good, and a headless
395
+ (no command plane) mount.
396
+
397
+ ## [0.1.2] - 2026-08-23
398
+
399
+ ### Changed
400
+
401
+ - Self-contained bundle: `dsh-llm` / `dsh-skill` are inlined, so the runtime
402
+ only depends on the `@deepseek-ai/cordis` peer — installable from GitHub,
403
+ tarball, or npm without a dsh source tree.
404
+ - npm scope renamed to `@mengyuly/dsh-ponytail` (matches the npm account).
405
+
406
+ ### Tests
407
+
408
+ - CI smoke verifies the bundle leaves no dsh core external and loads with only
409
+ cordis installed.
410
+
411
+ ## [0.1.0] - 2026-08-23
412
+
413
+ ### Added
414
+
415
+ - Initial release: always-on lazy-senior-developer ruleset, lite/full/ultra/off
416
+ intensities, six skills and slash commands, deactivation phrases,
417
+ `PONYTAIL_DEFAULT_MODE` / config-file defaults, subagent matcher.