把一份国自然申请书的身份线索、篇幅与形式项,逐条核对成本机构看得懂的差异清单。
面向科研管理人员的 DeepSeek Harness 检查插件:读取正文行与电子文档属性,按本机构名单和版本化规则库报出「哪条、哪行、差什么」,每条发现都标出所依据的条款与依据类型。
安装 · 配置 · FAQ · 简体中文 · English · Español · Português · हिन्दी
dsh plugin --profile <name> add dsh-nsfc-form-check社区插件,与 DeepSeek 官方无关。唯一仓库:https://github.com/PerryLink/dsh-nsfc-form-check(Gitee 为镜像)。
dsh-nsfc-form-check 读取一份国家自然科学基金申请书——正文行、电子文档属性,以及本机构自己维护的申请人、依托单位与导师名单——再按版本化规则库逐条核对:名单是否配置,配置的身份词在正文的哪一行出现,标题、作者、单位、「最后修改者」四个属性各写了什么,材料是否超出使用方设定的长度限额,形式审查项与重复申请披露说明是否齐备,导师姓名是否已按当年指南要求如实填写,以及是否出现配置的涉密或敏感词。
每一条发现都写出它所依据的条款,并标明该条款是直接规定、原则推论还是本机构配置;每一项无法执行的检查都以 skipped 连同原因列出。所以发现列表为空永远不等于没有问题——下结论前先看 NF-001 与 skipped。
它只列材料与所引条款之间的字面差异,不判合规、不认定责任、不替代审核人。支持 .docx、.txt、.md、.json、.yaml;.pdf 不由本插件解析(原因见「材料格式」)。纯 ESM,无联网、不调用模型、无原生代码。
proposal.docx ──parse──▶ lines + properties ──check──▶ findings + skipped
▲
└── rules/nsfc-form-check.yaml (NF-001…NF-015)
-
安装(三选一):
# git 通道(最新 main;会执行 prepare 构建) dsh plugin --profile <name> add github:PerryLink/dsh-nsfc-form-check # npm 通道(已发布版本,含构建好的 lib/) dsh plugin --profile <name> add dsh-nsfc-form-check # tarball 通道:本仓库 pnpm pack 后 dsh plugin --profile <name> add ./dsh-nsfc-form-check-<version>.tgz
-
最小配置(把本机构的名单填进 profile patch;名单不随包分发):
- insert: - id: dsh-nsfc-form-check name: dsh-nsfc-form-check config: authorNames: ["张伟"] institutionNames: ["示例大学", "示例大学附属第一医院"] advisorNames: ["李建国"]
-
验证已生效:
dsh --profile <name> --dump-config | grep 'dsh-nsfc-form-check'
仓库内还带一份可复核的最小样例(先
pnpm install && pnpm run build,因为脚本直接 import 构建产物):node samples/quickstart/run.mjs --check
nsfc_form_check: quickstart OK — output matches expected/result.json这份样例的期望结果是 1 条发现、14 条
skipped,见samples/quickstart/expected/result.json;输入与截图在samples/quickstart/input/与docs/assets/quickstart.png。
卸载:dsh plugin --profile <name> remove dsh-nsfc-form-check(或从 profile patch 删掉该行)。
- 名单先行,空名单不算通过 ——
NF-001在三个名单全空时最先报出;所有依赖名单的检查逐条进skipped,不会静默放行。 - 逐行定位 —— 正文匹配是字面、按行的,每条发现都带行号;少于两个字的词与
allowList中的词不参与匹配。 - 文档属性独立成条 ——
NF-005到NF-008分别读标题、作者、单位、最后修改者四个属性,不把它们混入正文结论。 - 篇幅与形式项按年配置 ——
NF-010、NF-011、NF-012的阈值、清单与披露要求全部留空出厂,未配置即进skipped。 - 导师姓名做正向检查 ——
NF-014与NF-004方向相反:年度指南要求如实填写导师姓名,这一条检查「有没有填」。 - 涉密词单列 ——
NF-015是规则库中唯一直接引用「不得出现」明文的检查,对象是涉密与敏感信息,不是身份。 - 依据透明 —— 每条发现都带
document、number、clause、逐字excerpt与source;依据仅为原则或本机构配置的规则在加载期被限制严重级。 - 只列差异 —— 报告不下定性结论,供科研管理部门人工复核。
| 规则 | 检查内容 | 严重级 | 依据类型 |
|---|---|---|---|
NF-001 |
身份线索词名单未配置时,相关检查无法执行 | warn | 原则推论 |
NF-002 |
正文中出现申请人姓名(提示,非法定要求) | warn | 原则推论 |
NF-003 |
正文中出现依托单位名称(提示,非法定要求) | warn | 原则推论 |
NF-004 |
正文中出现导师姓名(提示,且与现行指南要求相反的场景需区分) | warn | 原则推论 |
NF-005 |
电子文档属性中的标题含身份线索词 | info | 原则推论 |
NF-006 |
电子文档属性中的作者字段非空或含申请人姓名 | info | 原则推论 |
NF-007 |
电子文档属性中的单位字段含依托单位名称 | info | 原则推论 |
NF-008 |
电子文档属性中的「最后修改者」含申请人姓名 | info | 原则推论 |
NF-009 |
按配置的行范围统计身份线索词出现位置 | info | 原则推论 |
NF-010 |
材料长度应符合本机构配置的限额 | info | 本机构配置(辅以直接条款) |
NF-011 |
材料应包含本机构形式审查清单要求的条目 | info | 本机构配置 |
NF-012 |
声明已获得其他资助或重复申请时应包含披露说明 | info | 本机构配置 |
NF-013 |
指定行范围内出现身份线索词 | info | 原则推论 |
NF-014 |
应如实填写研究生导师和博士后合作导师姓名 | info | 本机构配置(辅以直接条款) |
NF-015 |
申请书不得含有涉密或敏感信息 | info | 直接条款 |
下表是示例集:第一行是详细走查,其余行是简短案例。
工具 nsfc_form_check
输入
{"text":"申请代码:H0301\n项目名称:某信号通路在疾病进展中的作用机制研究","metadata":{},"roster":{"authorNames":[],"institutionNames":[],"advisorNames":[],"allowList":[]}}输出
{
"id": "dsh-nsfc-form-check.NF-001.811c9dc5",
"ruleId": "NF-001",
"severity": "warn",
"locator": {},
"found": "未配置任何可核验的身份词(申请人姓名、依托单位名称、导师姓名均为空)",
"expected": "匿名检查需要名单才能执行;未配置时其余匿名相关检查只能逐条报为未执行"
}Observed from dsh-nsfc-form-check/tests/fixtures/NF-001/NF-001-unsafe.json
| 你会问 | 它怎么答 |
|---|---|
| 申请人姓名名单没填,匿名检查是不是就直接通过了? | 不是。authorNames、institutionNames、advisorNames 三项都为空时,最先报出的就是 NF-001,其余需要名单的匿名检查逐条以 skipped 连同原因列出。所以发现列表为空永远不等于没有问题——下结论前先看 NF-001 与 skipped 条目。 |
| 正文里出现了一个与申请人同姓的合作者。 | NF-002 按行逐字匹配配置的 authorNames,因此同姓同名、常见姓氏、引用他人姓名都可能命中。命中只是技术性提示——《国家自然科学基金条例》(国务院令第796号) 第二十一条要求评审方保密,并未禁止正文出现姓名——已经人工确认无需处理的词可以加入 allowList。 |
| 文档属性里的作者栏有名字,会报出来吗?需要先配名单吗? | 会报,且不必先配名单。NF-006 在 authorNames 为空时也会报出非空的作者字段,配了名单则进一步说明是否命中申请人姓名;NF-005、NF-007、NF-008 需要身份词名单,没有名单即进 skipped。这四条都只读文档属性,对正文内容不作任何判断。 |
| 页数和字数限额是我自己填的,它会告诉我材料超长吗? | 只在你自己填的限额内报。NF-010 出厂时 maxLines 与 maxChars 均未配置,本条进 skipped,因为限额逐年变化且按项目类型不同;填好之后,超出配置的段落行数或字数会被报出。maxLines 统计的是抽取后的段落行数,不等同于排版页数,不能当页数用。 |
| 本机构科研管理部门要求的形式审查项,材料里都有吗? | require 未配置时 NF-011 报自己进 skipped,没有清单时它不假装知道清单是什么。配置之后,它按你写的 match 字面匹配,把找不到的条目报出。它只核对字样是否存在,不判断该栏是否填写正确,也不判断签字是否真实。 |
| 我们是在去年申请基础上重新提交,必须写披露说明吗? | NF-012 需要两项配置同时到位:markerPatterns 用来识别你所在模板对重复申请或延续申请的表述,requiredDisclosure 列出必须披露的内容。缺任一项本条进 skipped;配了标记但材料中没有该声明时,本条报告为不适用。它不假定披露内容的写法,也不判定这份材料究竟是否属于重复申请。 |
全部可调参数都在 src/config.ts 的 Schemastery schema 中,只改 cordis.yml 即可生效,无需改代码;逐条阈值在 rules/ 下的规则库文件里。按 id 覆盖会替换整行——请重述所有需要的键。
最常用的键:
| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rulesFile |
string | rules/nsfc-form-check.yaml |
规则库文件路径,相对插件包根目录 |
authorNames |
string[] | [] |
要检索的申请人姓名 |
institutionNames |
string[] | [] |
要检索的依托单位与院系名称 |
advisorNames |
string[] | [] |
要检索的导师姓名 |
allowList |
string[] | [] |
即使命中也要忽略的词语 |
disabledRules |
string[] | [] |
要停用的规则 id 列表;每条都会出现在 skipped 中 |
onlyRules |
string[] | [] |
只执行这些规则 id;留空表示执行全部规则 |
timeoutMs |
number | 120000 |
工具协作式超时预算(毫秒) |
完整配置表(9 个键)
| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rulesFile |
string | rules/nsfc-form-check.yaml |
规则库文件路径,相对插件包根目录 |
disabledRules |
string[] | [] |
要停用的规则 id 列表;每条都会出现在 skipped 中 |
onlyRules |
string[] | [] |
只执行这些规则 id;留空表示执行全部规则 |
skipNotes |
string | "" |
附加到每条 skipped 说明后的备注 |
authorNames |
string[] | [] |
要检索的申请人姓名 |
institutionNames |
string[] | [] |
要检索的依托单位与院系名称 |
advisorNames |
string[] | [] |
要检索的导师姓名 |
allowList |
string[] | [] |
即使命中也要忽略的词语 |
timeoutMs |
number | 120000 |
工具协作式超时预算(毫秒) |
规则级参数值得知道:
NF-009coverLines—— 开头多少行算封面页。留空表示不假定任何机构的模板。NF-010maxLines/maxChars—— 你本年度、本申报类型适用的篇幅限额。maxLines统计抽取后的段落行数,不等同于排版页数。NF-011require—— 本机构的形式审查项清单,形如[{ label, match }]。NF-012markerPatterns/requiredDisclosure—— 你的模板如何识别重复申请,以及必须披露什么。NF-013patchedSections/scopeFromLine/scopeToLine—— 按指定词表与行范围统计身份线索词。NF-014requireMention+advisorNames—— 反向检查,按年度显式开启。NF-015secretTerms—— 本机构保密部门的词表。插件不带任何词表,因为什么算涉密由国家保密规定界定,不由本插件界定。
profile patch 覆盖示例:
- insert:
- id: dsh-nsfc-form-check
name: dsh-nsfc-form-check
config:
authorNames: ["张伟", "李娜"]
institutionNames: ["示例大学"]
allowList: ["张"]
disabledRules: ["NF-009"]名单没填时,匿名检查会不会静默通过?
不会。NF-001 会在三个身份词名单全空时最先报出,所有需要名单的检查逐条进 skipped 并写明原因。发现列表为空只表示「没有可报的差异」,不表示材料合规。
正文出现同姓合作者或常见姓氏,会不会刷屏?
会命中,因为 NF-002 按字面匹配。命中只是技术性提示,不是违规结论。把已确认无需处理的词(例如常见姓氏、引用他人成果)加进 allowList;少于两个字的词本来就会被忽略。
支持 PDF 吗?
不解析。按页精确抽取文本是另一套问题,抽错页比不抽更糟。请先用你信任的工具把 PDF 转成文本,通过 text 传入,或把申请书转成 .docx。
它会不会判定「不合规」,或替代审核人?
不会。报告只列材料与所引条款之间的字面差异;渲染层有措辞守卫,且始终带免责声明。匿名性相关发现只是身份线索词提示,把它当合规门槛来用是错误的(详见「安全边界」)。
性能开销多大?数据会去哪里?
插件不联网、不调用模型、不写回原文件,只在内存中读取材料并生成报告。开销主要随材料长度与名单条数增长;.docx 需要解包读取正文与属性,比纯文本略慢。没有任何网络请求,也没有持久化。
边界: 本插件核对国家自然科学基金申请书的文本与电子文档属性,报出它发现的身份线索,以及部署方配置的篇幅与形式审查项。它不是 dsh-rulefile-check(后者审查规范性文件的合法性),不是 dsh-policy-brief-draft(后者起草政策解读),也不是 dsh-review-reply-check(后者跟踪评审意见)。它读取一份申请书,并报出与所引条款之间的字面匹配。
目前没有任何国家规定禁止申请人的姓名、单位或导师出现在国家自然科学基金申请书中。 为编写本插件,完整阅读了三份独立文本——《国家自然科学基金条例》(国务院令第796号)、2026 年度《项目指南·申请规定》以及 2019 年度指南——其中没有任何一份包含 匿名、盲审、活页,或任何关于身份的「不得出现」表述。该条例中根本没有「匿名」一词。其回避条款(第二十条)要求来自申请人同一法人单位的评审专家回避,这恰恰以系统知晓申请人所在单位为前提——与匿名流程正好相反。
因此,本插件就姓名或单位作出的每一项发现,都只是供人自行权衡的技术性观察,标记为 身份线索词,从不表述为违规。本插件可用于科研管理部门的自查,但把它当作合规门槛来用是错误的。有两条规则更进一步,逐字引用了指南:
NF-014核对导师姓名已填写,因为年度指南有此要求;NF-015核对 涉密与敏感信息,这是真正存在的唯一一项「不得出现」要求——而它的对象是涉密信息,不是身份。
| 文件 | 文号 | 引用它的规则 |
|---|---|---|
| 《国家自然科学基金条例》 | 国务院令第796号 | NF-001, NF-002, NF-003, NF-004, NF-005, NF-006, NF-007, NF-008, NF-009, NF-010, NF-011, NF-012, NF-013, NF-014, NF-015 |
| 《2026 年度国家自然科学基金项目指南·申请规定》 | 2026 年度(逐年更新) | NF-014, NF-015 |
《国家自然科学基金条例》已于 2024-11-08 由国务院令第796号修订、2025-01-01 施行,取代国务院令第487号(2007)。规则库只按 796 号版本的条号引用;已废止版本的条号不会出现(有测试断言)。逐条核验记录在 rules/evidence/clause-verification.md 与 rules/evidence/clause-verification-nsfc-regulation.md。
指向 .docx 时,插件自己读取正文与文档属性。.pdf 不解析:按页精确抽取是另一套问题、另一种失败模式,抽错页比不抽更糟,所以请把你自己抽取的文本传进来。.txt、.md、.json 也接受;JSON 形式显式携带正文与属性两部分。
{
"lines": ["申请代码:H0301", "一、立项依据与研究内容", "……"],
"metadata": { "title": "某信号通路机制研究", "author": "", "company": "", "lastModifiedBy": "" }
}匹配是字面、按行进行的,因此每条发现都带行号,可直接跳到对应位置。少于两个字的词会被忽略,allowList 中的词也会被忽略,否则一个常见姓氏就会淹没整份报告。
规则数据在 rules/nsfc-form-check.yaml。每条规则都带文件名、文号、按原文自身编号体系的条款号、逐字摘录与来源地址。加载器强制:摘录必须是至少八个字符的真实引文;依据仅为一般原则或本机构政策的检查,不得标为 error。
有四件事塑造了这个规则库:
- 条例已修订。 《国家自然科学基金条例》现为国务院令第796号(2024-11-08 修订,2025-01-01 施行),取代国务院令第487号(2007)。条款号随之变化:评审保密义务现在是第二十一条,不再是旧版第二十四条。规则库只引现行版本,并有测试断言已废止令号不会出现。
- 匿名化没有法律依据,理由见「安全边界」。规则库把这一点写进每条规则的备注,让读报告的人不必翻 README 也能看到。
- 导师姓名是「必须填」,不是「不能出现」。 年度指南要求申请人如实填写研究生导师和博士后合作导师姓名。
NF-014因此检查的是NF-004的反面,规则库解释了二者为何并存。 - 年度政策是配置,不是代码。 页数/字数限额、限项细则、包干制范围、年度不予受理情形都逐年变化;它们全部以空配置出厂。
完整核验报告(含已核查并排除的来源)在 rules/evidence/clause-verification.md。
- 插件装上了但工具不出现:确认
main指向lib/index.mjs且pnpm run build已生成该文件;main写错会让加载器静默跳过该条目。 - 所有身份检查都是 skipped:没有配置名单。填入
authorNames、institutionNames与advisorNames后,NF-001会停止报告。 - 常见姓氏让报告很吵:把该词加入
allowList;插件不会替你猜测哪些命中是有意义的。 - PDF 被拒绝:这是设计行为。用你信任的工具抽取文本后通过
text传入,或转成.docx。 dsh plugin add报版本不兼容:peer 范围覆盖0.1.x与0.2.x;若运行时在其之外,可显式豁免:dsh plugin --profile <name> allow-version dsh-nsfc-form-check@0.1.0 --dsh-version <runtime> --accept-riskcheck报manifest-peers失败:静态检查器比对的是一份早于 0.2 世代的硬编码 peer 范围;安装期的 peer 校验以运行时为准,因此声明范围是正确的。这是dsh-plugin-dev的已知上游问题。- 时间看起来偏移:全部计算都是对输入字符串做墙上时钟运算,不做时区换算。
| 项目 | 状态 |
|---|---|
| Harness | 对等版本范围 >=0.1.2-rc.1 <0.2.0 || >=0.2.0-0 <0.3.0——已实测同时接受 0.2.0-rc.2 与 0.2.1-rc.2。engines.dsh 声明为 >=0.2.1-0 <0.3.0,0.2.1 起由宿主强制 |
| Node | ^22.19.0 || >=24.0.0 |
| 平台 | 全平台(纯 ESM;无原生代码、无联网、不调用模型) |
| 工具模式 | native 与 ptc 均可;批量核对整个目录时建议 ptc,schema 成本只付一次 |
- Gitee 镜像(同步镜像,以 GitHub 为准)
- dshfind 插件页(安装量与排名)
- OpenSSF Scorecard 报告(由 .github/workflows/scorecard.yml 驱动)
- DSH Market(已收录)
- 按材料选核查器——家族核查器的选型索引
- 生态实测知识库:插件开发指南 · 选型数据 · 维护取舍判据
pnpm install
pnpm run typecheck # tsc --noEmit
pnpm test # vitest;每条规则一对夹具,外加真实 .docx 往返
pnpm run build # tsdown -> lib/index.mjs + lib/index.d.mts
pnpm run verify:self-contained
pnpm run check:lockfile
pnpm run check:readmes # 五语 README 一致性
pnpm run check:citations # 规则库引文逐字核验
pnpm pack # 发布 tarballtests/docx-fixture.ts 在内存里构造真实的 .docx 包(带 deflate 条目的真正 ZIP),所以 docx 路径是端到端跑的,同时夹具仍保持为可审阅的 JSON。快速试跑:node samples/quickstart/run.mjs --check。配图由 scripts/gen-readme-assets.py 程序化生成(Python + Pillow),可重复执行。
| 路径 | 作用 |
|---|---|
src/index.ts |
函数式插件契约:注册 nsfc_form_check 工具、解析规则库路径 |
src/config.ts |
Schemastery 配置 schema;所有可调项都在这里 |
src/check.ts |
纯检查核心 (input, ruleset, options) => Report,无 I/O、无时钟、无模型 |
src/parse.ts |
材料读取(JSON / YAML / 文本 / docx 字节) |
src/view.ts |
面向模型的报告投影,与 output.schema 对应 |
src/shared/ |
家族共享件(规则库加载、报告结构、YAML 子集、措辞守卫等),复制进来以保持包自包含 |
rules/ |
15 条规则与逐条引文核验记录 |
tests/ |
每条规则的合规/违规夹具,以及 docx 往返测试 |
Topics:deepseek-harness, dsh, dsh-plugin, cordis, nsfc, form
本项目是 PerryLink 维护的 DeepSeek Harness 插件家族成员(全部 Apache-2.0)。如果这个插件帮到了你,给个 star——它不解锁任何功能,但会让下一个人更容易找到它。
- @PerryLink —— 创建者与维护者:规则库、检查核心、五语文档。
展开全部插件
LICENSE(Apache License 2.0)© 2026 dsh-nsfc-form-check contributors
Apache-2.0 · 社区插件,与 DeepSeek 无关。