统计口径、原始命令、样本量、结论和局限都在这里。所有数字都可以用仓库里的 scripts/measure-prose.mjs 复跑。
- 实质回复:去掉代码块后可见字符 ≥ 120,且句子数 ≥ 2。
- 首屏结构化(主口径):回复前 300 个字符内出现 ≥2 行表格、≥2 个清单项、≥2 个标题,或 ≥1 个
dsh-ui组件块。首屏在原文上截取;dsh-ui计入结构,普通代码块内容不计(避免代码里的|/-误判)。 - 散文违规:实质回复、首屏不结构化、且句子数 ≥ 3。
- 散文率:散文违规数 ÷ 实质回复数。
- 整篇口径(对照):只要回复任意位置出现上述结构就算结构化。两个口径同时输出,避免只挑好看的数。
- 口径细节:句子按
。!?!?;;\n与.切分后、长度 ≥6 字符的片段计数;表格按行计数(含表头与分隔行);--since-days是相对时间窗,--before按会话文件 mtime 过滤,因此 737/6159/5727 这组数只在窗口不变时可复现。 - 与人工基线的差异:37.5% 是人工抽检 56 条的结果,38.7% 是全量脚本口径,相差 1.2 个百分点,视为同一量级。
为什么用首屏:需求是「老板点开就能扫到结论和组件」。结构埋在 800 字之后,整篇口径会算它合规,但阅读体验没有改善。首屏口径在历史语料上复现出接近人工审计的基线(见下)。
- 时间窗:最近 30 天,写入时间早于
2026-10-20T21:35:00+08:00(插件首次安装时刻)。 - 样本:737 个会话 / 6159 条最终回复 / 5727 条实质回复。
- 命令:
node scripts/measure-prose.mjs --since-days 30 --before "2026-10-20T21:35:00+08:00"
node scripts/measure-prose.mjs --since-days 30 --before "2026-10-20T21:35:00+08:00" --whole| 口径 | 结构化 | 散文 | 散文率 |
|---|---|---|---|
| 首屏(主) | 3494 | 2216 | 38.7% |
| 整篇(对照) | 4746 | 964 | 16.8% |
与任务书给定的人工审计基线 37.5%(21/56) 基本一致。差异来自样本不同(人工只挑「符合触发条件」的 56 条,脚本覆盖全部实质回复)。
- profile:
structured-test(dsh-base+dsh-headless+dsh-structured@0.1.2)。测试构建是 0.1.2;0.8.1 只改规则文本(清晰度约束,无运行时截断/字数统计),host 注入与统计口径未变;0.7.4 为上一发布版。 - 模型:headless 默认
deepseek-flash。 - 样本:12 个新会话,同一组 12 条问题;12/12 会话的
system/message都同时命中主规则段与尾部提醒。 - 命令:
node scripts/measure-prose.mjs --sessions "<12 个会话 id,逗号分隔>"
node scripts/session-inspect.mjs --session <id> --grep "结构化输出(本会话已启用"| 口径 | 结构化 | 散文 | 散文率 |
|---|---|---|---|
| 首屏(主) | 12 | 0 | 0.0% |
| 整篇(对照) | 12 | 0 | 0.0% |
结论:改后 0/12,达到 <10% 的目标。
同一测试 profile、同一组 12 条问题:
| 组 | 插件 | 实质回复 | 结构化 | 散文率 |
|---|---|---|---|---|
| baseline | 未安装 | 12 | 12 | 0.0% |
| after | 0.1.2 开启 | 12 | 12 | 0.0% |
这批问题是短问题(如「pnpm 和 npm 该怎么定」),~/.dsh/AGENTS.md 第 7 节本身已经足以让模型输出表格/清单,所以 同 prompt 的增量为 0。插件在这批样本上可证明的作用是「请求级保证」:12/12 请求的 system prompt 里都有规则段和尾部提醒,不依赖模型记得住 AGENTS.md。
真正需要插件兜底的是长上下文/复杂会话——那正是 38.7% 历史基线的来源。单轮 headless 压测无法稳定复现这种衰减,因此不把配对增量当作主要证据。
- 构造约 9.9k 字符的周报记录,末尾问「现在什么情况?我该先处理哪一件?」。
- 对照组:插件仍安装,但用
--patch把defaultEnabled覆盖为false。 - 结果:两组都输出了首屏表格(control 664 字符,treatment 664 字符),按脚本口径都是 0% 违规。
结论:在当前模型/单轮 harness 下,长上下文本身没有把「结构化」压成散文,因此没有可报告的配对增量;这一点如实记录,不用合成数据凑效果。
# 全量历史(注意 --before 选插件安装前的时刻)
node scripts/measure-prose.mjs --since-days 30 --before "2026-10-20T21:35:00+08:00" --verbose
# 某个会话
node scripts/measure-prose.mjs --sessions session-xxxx
# 换首屏阈值 / 换整篇口径
# 500 是视口高度像素,不是字数;0.8.1 起不设硬性篇幅上限
node scripts/measure-prose.mjs --first-screen 500
node scripts/measure-prose.mjs --whole脚本只读 $DSH_HOME/sessions,不写任何状态;没有第三方依赖,Node ≥ 22(用内置 zstd)。