DeepSeek Harness Hub
← 返回列表

语义文档漂移检查jonah791/dsh-semantic-docs

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

读写语义文档注册表,按证据重判状态并报出漂移

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/14 · 已提供中文文档

DSH 本地语义文档系统工具面:semantic_list/get/check/register + D1–D6 drift 判据(单一真源、文档随代码、未验证显式、留白诚实)。

综合分
29.8
GitHub 分
29.8
用户评分
★ Stars
0
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add jonah791/dsh-semantic-docs
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery@deepseek-ai/dsh-tools
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-semantic-docs

一句话:把「每个能力都有一份说清自身语义的文档」变成可执行、可检查的设施——4 个工具读写语义文档注册表、按证据重判条目状态、跑 D1–D6 drift 检查、生成人类索引。

为什么值得用:文档最危险的形态不是「没有」,而是声称与事实不符——注册表写着 verified,实际验收还有 pending;文档写着路径,那个文件早被搬走;实现改了,语义文档还停在上个版本。这类漂移靠自觉发现不了,靠人审又会漏。本插件把「声明」与「证据」(路径存在性、验收统计、mtime、必备结构节)分开维护,每次调用现算状态并报出判据理由——但它只报不改:报出来的是信号,处置归主体。

能力

| 工具 | 用途 | 关键语义 |
|------|------|---------|
| semantic_list | 列出语义文档注册表条目(可按 status/owner 过滤),并对每条现算状态(声明 ≠ 事实:按 impl 落点 + 文档解析出的验收 pending 重判) | 读注册表 + 现算 + 每条 drift 代码;status 过滤作用于声明,不是现算值 |
| semantic_get | 取单条语义文档条目详情:声明状态 + 现算状态(含判据理由)、文档大纲(标题树)、可证伪验收统计(总数/已证/待验)、未决问题数、impl/twins 落点存在性 | id 不存在 → ok:false 并列出已知 id(不静默返回空) |
| semantic_check | 语义文档 drift 检查(D1 路径不存在 / D2 状态与证据不符 / D3 实现比文档新 / D4 必备结构缺节 / D5 存在未注册的 docs/semantic.md / D6 缺「实践修订记录」小节)+ 建议动作 | 只报不改;缺省查全部条目,可传 id 单查;返回 summary + actions + notes |
| semantic_register | 登记/更新一条语义文档条目(幂等 upsert,同 id 不重复)并重新生成 docs/semantics/INDEX.md | 不写文档正文(I2:文档随代码);acceptance/openQuestions 由文档解析自动回填;注册表坏 JSON → 拒绝覆盖(坏注册表是证据,不许静默重建) |

drift 判据:

| 代号 | 判据 | 严重度 |
|------|------|-------|
| D1 | doc / impl / twins 路径不存在(含文档读取/解析失败) | error |
| D2 | 状态与证据不符(verified 但 pending>0 或 total=0;implemented 但 impl 全空) | error |
| D3 | 实现比文档新(impl 最新 mtime > 文档 mtime 且文档未标「待复核」) | warn |
| D4 | 必备结构缺节(10 项,按标题语义匹配) | error |
| D5 | 磁盘存在 docs/semantic.md 但未注册(排除 docs/semantics/* 系统自身目录) | warn |
| D6 | 注册表指向的文档不含「实践修订记录」小节(实践回修载体缺失) | error |

状态模型:draft → implemented → verified(deprecated 保留留痕,只查 D1)。声明低于证据(可晋升)只提示 ⤴可晋升,不算 drift——因为「draft 但 impl 已存在」也可能是实现进行中(语义精确性:不许用自己的判定掩盖合法状态)。

快速开始

1) 装依赖(自研插件家园 self-plugins/,在目标 profile 的 package.json 加 link 依赖):

"dsh-semantic-docs": "link:/self-plugins/dsh-semantic-docs"

2) 挂组合(agent 预设行):

- insert:
- id: agent-semantic-docs
name: dsh-semantic-docs
config:
enabled: true
workspace:

3) 30 秒验证:调 semantic_check(无参数 = 全量)
期望:返回 summary(error/warn 计数 + 每码计数)与 actions(按码给建议)。工作区里没有任何已注册条目时,你会看到一批 D5 warn(磁盘上有 docs/semantic.md 但没登记)——这正是它该报的,不是故障。用一个已注册条目 id 调 semantic_get,应能看到「声明状态 vs 现算状态」两栏同时出现。

配置

| 项 | 默认 | 说明 |
|----|------|------|
| enabled | true | 当前是纯声明:置 false 时 4 个工具仍注册(工具本身不做开关判断),见 docs/semantic.md §10 U1 |
| workspace | process.cwd() | 注册表/索引/扫描根的基准目录;建议由组合层显式给出 |

路径约定(固定,不改配置):注册表 /docs/semantics/registry.json(唯一真源)· 索引 /docs/semantics/INDEX.md(生成物,可重放,勿手改)· 能力文档习惯命名 docs/semantic.md(一仓多能力用 docs/semantic-.md)。

落盘与自证(出问题时先看这里)

本插件无侧车轨迹(/semantic-docs-trace.jsonl 之类尚不存在——「上次 drift 检查是什么时候、结果如何」目前不可从外部回答,见 §10 U4)。它的持久产物就是它管理的两个文件:

| 落点 | 写者 | 说明 |
|------|------|------|
| /docs/semantics/registry.json | semantic_register | 唯一真源;原子写(tmp → rename),无 BOM;坏 JSON 时拒绝覆盖 |
| /docs/semantics/INDEX.md | semantic_register | 人类索引;由注册表可重放生成——手改必被覆盖 |

semantic_list / semantic_get / semantic_check 只读:跑前后两个文件的 mtime 应完全不变(这是「只报不改」的可证伪判据)。

行为级替代(无 trace 时的五问):

node scripts/smoke.mjs && ls -l /docs/semantics/
① 线上跑的是哪个构建 → 无 build 字段;改为比 lib/index.js mtime 与 web 进程启动时间(见「生效判据」)
② 谁发起             → 无 caller 字段;发起者可查会话事件流(工具调用记录)
③ 断在哪一段         → 阶段枚举由返回值给出:注册表缺失(显式错误+路径) → 解析失败(D1) → schema 不合法(skipped + schemaIssues) → 判定完成(summary/actions)
④ 结果质量           → summary 的 error/warn 计数 + 每码计数;notes 里列出被抑制项(deprecated / needReview 抑制 D3 / 未注册文档)
⑤ 耗时与预算         → 无耗时字段;D5 扫描面 = 4 个根目录(跳过 node_modules/.git/dist/lib),条目多时为主要成本

不吞异常是硬约束:注册表缺失 / 空文件 / 坏 JSON / 条目 schema 不合法 → 显式错误或 issues(带绝对路径),绝不静默返回空清单。

生效判据与回退

生效判据(三选一):
1. 行为级:semantic_check 可调用并返回结构化 summary;semantic_get 传一个已知 id 能返回「声明 vs 现算」两栏;
2. 产物级:lib/index.js 的 mtime 早于 web 进程启动时间 ⇒ 进程在跑当前构建;
3. 生态级:plugin_boot_status(dsh-plugin-bootreport)的 live 含 dsh-semantic-docs、stale 为空 ⇒ 判据 2 的机器化版本。

注意:重新构建 ≠ 生效——npx tsc -p tsconfig.json 只写了一个新产物,进程启动时间必须晚于产物 mtime 才算「在跑它」。缺这一条时不得宣称「已生效」。
另注意:配置写着 enabled: false ≠ 工具被摘掉(当前实现如此,§10 U1)——要真正停用请用组合层 disabled: true。

回退:
- 源码级:git -C self-plugins/dsh-semantic-docs revert  → 重新构建 → 预检 → 重启;
- 组合级:预设里给 agent-semantic-docs 行加 disabled: true(或移除该行)→ 哨兵重启;
- 运行期:本插件只写自己管理的两个文件,回退后它们仍是合法 JSON/Markdown(可继续被人读);如需回到登记前的状态,用 git 回滚 docs/semantics/registry.json 即可(INDEX.md 可由注册表重新生成)。

测试

npm test        # = node --test "tests/.test.mjs"(跑 lib/ 产物,与运行时同源)

41 例离线测试(41/41 通过):

- tests/markdown.test.mjs —— 纯解析层:标题树、必备节语义匹配、验收清单解析、needReview 标记;
- tests/status.test.mjs —— 状态重判:verified 但 pending>0 → D2;证据够而声明低 → 只提示晋升;deprecated 不参与重判;
- tests/drift.test.mjs —— D1–D6 逐码判据,含 D4 缺节逐点名与 D3 被 needReview 抑制的分支;
- tests/registry.test.mjs —— schema 校验、非法条目 partition 到 skipped + schemaIssues、INDEX 渲染可重放;
- tests/corpse.test.mjs —— 尸体测试:注册表不存在 → 抛错并带绝对路径;坏 JSON → RegistryParseError;semantic_register 遇坏注册表 → 拒绝覆盖;D5 排除 docs/semantics/*。

离线单测不需要网络、不需要挂载插件、不需要 WSL:时间与文件系统都是注入的(FsLike),纯逻辑层可直跑 lib/ 产物。补充冒烟:node scripts/smoke.mjs(直测 execute + render + output.schema 一致性,不需挂载)。

设计要点

- 分层是测试性的前提:markdown.ts(纯函数解析)→ registry.ts(纯逻辑:schema/状态判定/D1–D6/INDEX 渲染)→ collect.ts(IO 适配,FsLike 注入)→ index.ts(Cordis 工具面)。时间与文件系统都是注入的,所以能离线对产物跑测试——新增判定逻辑必须落在纯逻辑层,不要写进工具闭包。
- 声明与事实分离:注册表存的是声明;每次调用按证据现算。二者不一致就报 drift,而不是自动改写声明——「自动把状态改成一致」会掩盖问题(且会破坏「坏注册表是证据」的原则)。
- fail-closed 的 pending 口径:acceptance.pending = 未取得通过证据的验收行数(total - proven),而非仅统计字面标「待线上验收」的行数;字面口径另以 pendingMarked 单独暴露(两面都可见,避免口径漂移)。
- 写入原子:注册表与索引均 tmp → rename,避免读到半截文件。
- 只报不改是刻意的能力边界:本插件不阻止任何修改、不接入 preflight_check(先观察误报率)。若把它当门禁用,会得到「检查过了」的错觉而实际无阻断。
- 解析基于 Markdown 标题语义是已知脆弱点:标题写法差异会漏判/误判,故工具输出附带「命中的原始证据」(标题/行号/行原文)便于人工复核;机器可读 front-matter 属未决问题(§10 U3)。
- D3 只比 mtime:不感知内容变更;跨时区/时钟回拨会失真。

能力边界诚实声明(capability ≠ sandbox)

本插件读写 workspace 内的文档与注册表,有权限的调用方就能改任意路径——不要把它宣传为安全边界或隔离机制。

相关文档

| 文档 | 内容 |
|------|------|
| docs/semantic.md | 权威契约:定位与反定位、术语、契约(配置与路径约定 + 状态→裁决表 + 调用点清单)、可证伪验收清单(A1–A10)、未决问题(U1–U6) |
| docs/semantics/README.md(工作区内) | 语义文档系统规范(路径约定、必备 10 节、状态模型、D1–D6 定义、模板) |
| alice-digital-life | 本插件所属生态的中心索引(全部自研插件) |
| 技能 semantic-doc-first / dsh-plugin-development | 语义文档优先开发模式(先写「是什么」再动手)、插件开发契约 |

License

MIT © jonah791

本插件属于我的数字生命爱丽丝(alice-digital-life)的 DSH 自研插件生态——50 个插件按生命/认知/感知/行动/通信/治理/呈现七层组织。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群