dsh-plugin-baiguangda-style
白广大风格写作插件(v2.5.0)。把机核网资深编辑白广大的中文写作风格——文风与写作逻辑——装进 DeepSeek Harness: 技能正文教模型怎么写,三个工具管写完怎么验,设置里还有一页:一个总开关管技能的挂与摘,三个配置项,外加贴一段稿子当场跑分数。资源随包携带,装到任何 profile 都能独立工作。
v2.3.0:阈值按 444 篇全量语料重标定
把该账号全部文章(444 篇 / 80.2 万字)抓下来重算分布之后,机检改了五处:
| 项 | 旧 | 新 | 依据 |
|---|---|---|---|
| 短句占比 | 下限 2%、上限 10% | 下限 1%、上限 15% | 池化 6.0%,但逐篇中位 0%——一半文章一句 ≤10 字短句都没有,4.4% 是均值,照它写会变成每段撒钉子 |
| 段首连接词 | > 5% | > 18% | 按段落统计:中位 3.7%、p90 21.4%;旧值 3.1% 是句子口径 |
| 破折号 | <1 也告警 | 只报 >4 | 中位 1.03,半数文章不到 1 处 |
| 强判断 | > 0.4/千字 | > 1.0/千字 | 实测 p90 = 0.88 |
| 数字密度 | 年份 < 3 | 年份 < 1 | 短文常无年份,误报 |
另新增两条检测:
- B22 AI 口头禅:说实话/说白了/说到底/值得一提的是/综上所述…全量语料合计 31 次 / 80 万字,密度约 0.04/千字;
- B23 导读腔:先把结论/先说结论/后面我会/总结一下,语料 0 处;
- B24 孤证数字:百分比/万亿级金额/次数 ≥3 处且句内无来源,提示补出处(全量语料误报率 4/60)。
还有一个细节:引号里的词不再计入检测。写文章讨论「先说」「说实话」这类词时,它们是被引用的对象,不该按作者口癖扣分——机检先剥掉 「」、“”、"" 里的内容再扫。
v2.5.0:去 AI 痕迹判据全表(4 A + 27 B)
机检由 skill/scripts/style_lint.js 实现,阈值读 skill/scripts/thresholds.json。
A 级(出现即回炉):A1 ASCII 直引号混排 | A2 元叙述(先说/再说)| A3「不是…而是…」| A4 黑名单(综上所述/值得注意的是/随着…的发展)。
B 级 27 条,按四层分:
| 层 | 判据 |
|---|---|
| 词法 | B1 签名超量 · B2 括号吐槽 · B5 数字密度不足 · B21 强度形容与自述框架 · B22 口头禅(说实话/说白了/说到底)· B25 冗余量词(一个/一种过密、「一个重要的变化」空壳) |
| 句法 | B3 句长落差与短句区间 · B6 破折号/括号密度 · B9 段首价值升华 · B11 段首连接词 · B16 自我限定腔 · B20 句号密度与逗号比 · B26 段落节奏(段长 p90/p10 < 4)· B27 连接词单一(单一词占 ≥70%) |
| 修辞 | B8 强判断金句 · B12 强对比 · B14 加粗金句 · B15 否定对举 · B18 辩证对冲与名词化强调 · B19 假设立论/正反重述/方法声明链 |
| 结构 | B4 无引用出处 · B7 段落长度均匀 · B10 小标题同义展开 · B13 对象漂移 · B17 句子功能层(标签句/元衔接/评价性短句/操作引导)· B23 导读腔 · B24 孤证数字 |
引号里的词不计入(「」、“”、"" 先剥掉再扫),避免"讨论『先说』这个词"被当成作者口癖。
配套命令
| 命令 | 作用 |
|---|---|
npm test |
冒烟 24 项:机检解析、审计判据、路由、开关、合写切分、访谈识别 |
npm run bench |
回归基准:7 个固定样本,容差 ±3 分、A 级须一致 |
npm run corpus -- --stats <目录> |
按语料重算分布,写 skill/corpus/baseline.json;加 --apply 按 p90 重写阈值 |
npm run corpus -- --crawl <目录> |
抓取该账号全部署名稿(约 5 次请求) |
设置页另有两块:批量试跑(最多 20 篇,出均分与区间)与阈值表(当前生效值 + 标定日期)。
为什么是「技能 + 工具」两层
市场上写作类插件分两派:一派只塞提示词(换个说法,模型还是原来那个模型),一派只做 lint(挑毛病,但不知道好文章长什么样)。 这个插件两头接上:
| 层 | 载体 | 解决的问题 |
|---|---|---|
| 怎么写 | skill/SKILL.md(40KB,12 章) |
标题公式、开头套路、节奏、语域三档、引用习惯、结尾、体裁变体、写作纪律 9.1—9.11 |
| 写完怎么验 | style_lint 工具 |
A 级硬错误 / B 级阈值警告 / C 级体检 / 预估得分(≥85 可发布) |
| 逻辑站不站得住 | style_audit 工具 |
立论是否前置、段末是否落在物证上、核心对象是否回访、小标题是否序数外露 |
| 阈值出处 | style_rules 工具 |
按关键词回查工具层 / 负样本库 / 完整版节选,返回 文件:行号 |
| 手上没文件时 | 设置页「白广大风格」 | 贴一段文字直接跑机检 / 结构审计,改配置也不用碰 YAML |
机检只覆盖词法与阈值;8 项人工判据(可交换性测试、判断的证据成本、零容忍清单……)仍要人过。插件不假装能替你判断。
安装
# 1) 装进 profile
dsh plugin --profile web add "C:\path\to\dsh-plugin-baiguangda-style"
# 2) 重启 dsh web(bundle 层在启动时组合,热改不生效)
# 3) 验证:会话里应出现 baiguangda-writing-style 技能 + 3 个工具;
# 「设置 → 白广大风格」出现一页(状态 + 配置 + 试跑)
不装 profile 也能单独跑:
node test/smoke.mjs # 22 项断言:机检解析、审计判据、条文检索、权限声明、设置页路由、总开关、插件装配
npm run sync # 从工作区 skill 目录重新同步 skill/ 快照
node scripts/sync-skill.mjs "D:/path/to/skill" # 指定源
配置:设置页或 cordis.patch.yml
三个键在「设置 → 白广大风格」里直接改,也可以写在 cordis.patch.yml 的 config 里(两种写法等价;设置页写的是 profile 的插件配置层):
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
总开关。关掉后不注册技能、不挂三个工具,设置页仍保留——在那页点一下就能再打开,不用重启 |
skillName |
baiguangda-writing-style |
注册进技能目录的名字 |
registerSkill |
auto |
auto 时若工作区/用户目录已有同名文件系统 skill 则跳过运行时注册;always 强制注册;never 只提供工具(旧的 true / false 仍然认) |
maxLintIssues |
12 |
style_lint 与设置页最多回显多少条 B 级警告(A 级全给),范围 0—50 |
为什么要 auto:DSH 技能注册是「同一层内项目条目优先于运行时条目」。文件系统里已有 .dsh/skills/baiguangda-writing-style 时,运行时注册的副本会被遮蔽——
白注册一份,技能目录里还多出一行重复项。auto 会探测到这种情况并只提供工具,同时在日志里说明原因。
设置页(/api/baiguangda-style + client.js)
装好重启后,设置里多一项「白广大风格」。它做三件事,全程不用开终端:
| 区块 | 内容 |
|---|---|
| 总开关 | 第一行就是开关:关掉当场摘下技能与三个工具(工具从模型可选列表里消失),设置页留着;再打开当场挂回。改的是 profile 配置层,重启后保持 |
| 状态 | 版本、技能是插件注册还是让位给文件系统同名项(连路径一起给出)、资源目录、校验脚本路径、权限自述 |
| 配置 | 技能名 / 同名时谁先说 / 最多列几条 B 级警告;点「保存」写进 profile 配置层,改技能名与让位策略会就地重注册,不必重启(总开关关着时这几项置灰) |
| 试跑 | 贴一段中文稿,点「跑机检」出分数 + A/B 明细,点「跑结构审计」出节表与待看清单 |
总开关为什么单独说:关掉不是「把配置改成不注册」,而是当场调 disposer 把技能和工具摘下来——ctx.skills.register() 与 ctx.tools.register() 都返回精确的卸载函数,sync() 统一管挂与摘,所以开关不需要重启就生效,也不会在模型侧留下一个调不通的工具名。
实现上有两条约束,改代码时别踩:
- 设置表单靠 schemastery
Config+ volatile 字段。dsh-settings只允许.extra('volatile', true)的字段经settings.update()写入;loader entry 的 id(cordis.patch.yml里是baiguangda-style)必须等于命名空间名,模块还要导出Config。schemastery 拿不到时Config是undefined,插件照常工作,只是设置页降级。 - client bundle 不是 ESM,是自注册脚本:
window.__ModuleLoader__.load({ id: '<包名>', factory }),页面靠ctx.get('slots')往settings.section槽位注册。package.json要有dsh.client(platform: web)和exports['./client'],否则 web 端不会加载它。
试跑要把文字落成临时文件才能喂给 style_lint.js——写入范围只限 os.tmpdir() 下带 baiguangda-style- 前缀的临时目录,跑完立即删除。这条边界写在 dsh.permissions.fs.write,test/smoke.mjs 会核对「只有 src/preview.js 动写盘」。
三个工具
style_lint(path, maxLintIssues?) # 机检:A/B/C 分级 + 得分 + 命中行号
style_audit(path) # 结构审计:节表 + 待看清单(≤12 条)
style_rules(topic, limit?) # 条文检索:关键词 → 段落 + 文件:行号
style_audit 的判定口径全部写在输出里,且分体裁:
- 论证体:查立论后置(首个判断句落在第 4 段之后)、段末未收束(结尾停在陈述且无数字/年份)、核心对象缺席、序数小标题、大节无判断句。
- 口述/访谈体(检出 ≥8 处
**说话人:**标记):立论前置、段末收束、判断句密度三项不适用,自动跳过——访谈稿按论证体挑毛病只会挑出噪音。 - 年表小节(标题是
1995这类纯年份):不参与论证判定。
权限声明(dsh.permissions)
DSH 目前不在运行时强制插件权限:插件以宿主用户身份在进程内跑,dsh.permissions 是一份自述——给安装者、审计者、市场审核看的,不是沙箱。
所以少写一条不会让插件跑不动,只会让读的人被骗。本包的做法是把声明钉进测试:node test/smoke.mjs 里有 5 条断言在比对「声明 vs 真实代码」,声明漂移就红。
| 声明键 | 值 | 含义 |
|---|---|---|
fs.read |
skill/**、src/**、index.js、ARG:path |
只读包内资源与被检稿件 |
fs.write |
$TMP/baiguangda-style-*/** |
只写系统临时目录:设置页试跑那一份稿子,跑完即删;包内资源与 profile 一律不写 |
process.spawn |
1 条:node skill/scripts/style_lint.js <ARG:path>,shell: false |
唯一子进程是本包自带的 CJS 校验脚本,不经 shell |
http.routes |
/api/baiguangda-style |
设置页的 status / config / lint / audit 四条接口:同源、不鉴权,只读写本插件自己的配置 |
net |
[] |
不联网 |
env.read |
DSH_HOME、USERPROFILE、HOME |
仅用于定位技能目录做同名探测 |
secrets |
[] |
不读任何 token / 凭证 |
registers.tools |
style_lint、style_audit、style_rules |
向 ctx.tools 注册的工具 |
registers.skills |
baiguangda-writing-style |
向 ctx.skills 注册的技能(auto 模式下可能让位给同名文件系统 skill) |
registers.settings |
baiguangda-style |
设置页的命名空间(ctx.settings 里的一条 entry) |
ARG:path 指调用方传入的路径,插件不对它做目录限制——要检哪个文件就传哪个,读的只是那一个文件。
目录
index.js 插件入口(Config 表单 + 技能 + 3 工具 + /api 路由)
client.js 设置页(自注册脚本,settings.section 槽位)
cordis.patch.yml bundle 组合层:id baiguangda-style
src/resources.js 资源路径解析、frontmatter 剥离、同名 skill 探测
src/lint.js 调 style_lint.js + 解析文本报告
src/audit.js 结构性/论证性判据(词表 + 位置近似)
src/rules.js 四份文档的关键词检索
src/config.js 配置归一(auto/always/never、B 级条数钳位)
src/preview.js 试跑:文字 → 临时文件 → 机检 / 审计(跑完即删)
skill/ 技能正文 + 工具层 + 负样本库 + 完整版节选 + corpus + style_lint.js
scripts/sync-skill.mjs 从工作区 skill 同步快照(单一真源在 .dsh/skills)
test/smoke.mjs 12 项冒烟断言
skill/scripts/package.json 声明 {"type":"commonjs"}:style_lint.js 是 CJS 脚本,而包本身是 ESM,靠这行就近生效。
已知边界
- 机检阈值来自 444 篇语料基线,天生偏向书面考据/评测;口播稿请按 SKILL.md 第十一节语域三档放宽。
style_audit是词表 + 段落位置判定,不做语义理解:命中只作「回去看一眼」的提示,不构成结论。- 插件不联网、不写外部状态,只读稿件与包内资源。
No comments yet. Be the first to write one.