Sci2Doc
Overview
本技能适用于博士或硕士学位论文,需用户提供已成稿的 SCI 论文材料作为转化来源。若用户没有可访问的 SCI 论文材料,或场景是本科毕业论文,主动退出本技能,不要套用本流程。
This skill converts SCI paper materials (PDF/Word plus user context) into a Chinese doctoral thesis draft.
This skill is process-first, not one-shot generation.
The workflow is built around:
state_manager.pyfor anti-forgetfulness, token budgeting, gate checks, snapshot/rollbackatomic_md_workflow.pyfor atomic subsection markdown files, numbering validation, merge, self-check, section-level snapshot
【Python 解释器探测·开工第一件事,一次探测全程沿用】 本文命令里写的 python3 / python 只是 macOS/Linux 的习惯写法,不是硬性要求。动手前先跑一次 python3 --version:
- 打印出正常版本号 → 本次会话所有命令照抄用
python3。 - 报 command not found、没有任何输出、或弹出应用商店 → 改跑
python --version,能出版本号就把后续所有命令里的解释器统一换成python。注意 Windows 自带一个 0 字节的python3占位程序,python3 --version弹商店或无输出就是撞上了它,不算有 python3,按"没有"处理(用户也可在 设置 → 应用 → 应用执行别名 里关掉python3.exe)。 - 反过来
python出不了版本号就换python3(macOS 12.3 起系统不再自带python)。 - 两个都出不了版本号 = 这台机器没装 Python,停下来告诉用户先安装,不要硬跑。
- 探测只做这一次,之后所有命令沿用同一个名字,不要每条命令都再试。
接续与决定日志(每次启动本技能先跑)
学位论文往往跨多次会话才写完,用户中途还常插新要求。连续性靠外部状态文件维持,不靠模型记忆:
- 开局先跑接续报告并打握手:
env_preflight.py会打印RESUME_CMD(绝对路径)。照它跑python <..>/session_journal.py resume --root <project_root>,把输出贴给用户并确认「从这里接着写」再动笔。 - 用户每插一条新要求/新决定,立即 log:
python <..>/session_journal.py log --root <project_root> --note "用户要求:<原话>"。 决定写入decisions_log.md(append-only),后续会话必读并遵守。 - 引文核证命令:
env_preflight.py同时打印CITATION_CHECK_CMD,见## Citation Claim Check (承重论点↔引文)。
快速流程索引 (Quick Workflow Index)
全流程 7 步顺序如下,详细说明见各节。
| 步骤 | 操作 | 阻断条件 | 详见 |
|---|---|---|---|
| 0. 材料确认 | 确认源材料可访问、用户提供论文题目/章数/院校 | 材料缺失 → 停止 | ### 0) Material Input Gate |
| 0.5. 研究主线设计 | 产出科学问题→贡献→章节映射表;协商章节字数目标;写入 outline |
outline 为空 → 不得进入 Step 1 |
### 0.5) Research Storyline Design |
| 1. 样式选择 | 询问 内置默认模板 or 自定义;写入 thesis_profile.json |
自定义信息不完整 → pending_template |
## Style Selection Gate |
| 2. 初始化项目 | state_manager.py init;验证 profile;章节字数已在 Step 0.5 协商 |
profile 缺字段 → 不允许生成 docx | ### 1) Initialize Project |
| 3. 文献检索 | 学科路由(生命科学→PubMed CLI / CS/AI→paper-search MCP);运行 citation_guard | guard ok=false → 停止写作 |
## Citation Zero-Hallucination Gate |
| 4. 预写门禁 | write-cycle --chapter N 加载跨章记忆 |
每章每节必做,不可跳过 | ### 2) Prewrite Gate |
| 5. 原子化写作 | 每节一个 .md;写完验证编号+实验映射;更新 chapter_index.json;原始图不可用时生成 Figure Prompt |
编号断裂 → 修复后才能继续 | ### 3) Atomic Subsection Writing |
| 6. 快照与质量门 | 节后快照;章后 self-check;humanizer 去 AI 化 | self-check 失败 → 修复 | ### 4) / ### 5) / ### 6) |
| 7. 合并导出 | merge → gate-check → generate Word | format acceptance 未通过 → 不交付 | ### 7) / ### 8) / ### 9) |
Style Selection Gate (Mandatory)
执行顺序: 本 Gate 在
### 0) Material Input Gate完成后执行(先确认材料,再选样式)。如无源材料,停在 Step 0,不进入 Style Selection。
初始化或起草前,AI 必须 让用户在两种样式中二选一:
默认设置:内置默认学位论文模板(通用格式,可自定义为任意院校)。机构字段为占位符(示例大学/[学校代码]),用户应替换为本校信息。自定义样式:用户须提供目标院校 + 详细 Word 格式要求和/或模板证据文件。
🔴 CHECKPOINT(阻断 init): 未与用户明确确认样式前,不得运行 state_manager.py init。即使用户可能想用内置默认模板,也必须先得到用户对"就用内置默认模板"的明确确认,再带样式参数运行 init。禁止 因看到 QUICK_START 的 init 示例就直接套用默认 --format-mode default_generic 跑 init(该默认会静默落成内置模板格式且立即放行 docx 导出)。
硬门禁: 自定义信息不完整的项目标记为 pending_template,可继续整理 markdown,但 不得生成 .docx、不得运行格式验收。custom 仅在写入结构化布局字段后才能转为 ready,否则保持 pending_template。
custom→ready 最小必填字段(缺一即保持 pending_template):page_margins_cm.top/bottom/left/right(四个边距)、header_distance_cm、footer_distance_cm、university_name、degree_type。
字段完整定义、需求→字段映射、managed front matter 文件清单、managed marker 覆盖规则等细则见 references/format_profile_schema.md § Style Selection Gate (full rules)。
Non-Negotiable Requirements
- Body text target depends on degree type: ≥50,000 characters for doctoral, ≥30,000 for master's (defaults; confirmed with user at project start and written to profile as
body_target_chars). 这是软目标而非硬门(check_quality.py字数不足为 warning):可经用户同意上调;不达标只提示、不阻断导出。真实材料撑不到目标时宁可少写,绝不编数据/灌水凑字(A③ 已把综述/绪论并入正文计数以减压)。 - Chapter-level target allocation is not hardcoded and must be negotiated with the user for each project.
- Chinese abstract must be 1500-2500 characters.
- Main structure is fixed:
- independent Introduction chapter
- multiple research chapters
- independent final Conclusion/Outlook chapter
- total chapters >= 5
- References are unified at the end of the full thesis.
- Body word count scope: abstract through end of body text (before full-thesis references). 综述/绪论章计入正文字数,把凑字数压力从研究章分摊出去,缓解逼 AI 靠编数据/扩实验凑字(
check_quality.py/count_words.py已将 review 章并入 body 计数,另单列review_words供展示)。仅全文末尾统一参考文献、目录、致谢、附录、成果、声明、缩略语表排除在外;若确有整章须排除,用format_profile.exclude_from_body_count(章标题字符串列表)逐章显式声明。 - For research chapters, Results & Discussion must map to Methods experiment-by-experiment.
- One experiment must map to at least one standalone figure or table.
- Atomic markdown is mandatory: one subsection per
.md, continuous numbering, merge before Word conversion. - Chapter completion requires immediate self-check.
- Each subsection summary completion requires immediate snapshot.
- Humanization is required before finalizing chapter text;细则见
## Humanization Contract。 - Do not invent experimental data. 13.1 Do not invent references; citation hallucination is forbidden.
- Literature retrieval follows topic-dependent routing (MANDATORY):细则见
## Citation Zero-Hallucination Gate。 - 缩写一致性强制执行:首次展开格式
中文全称(English Full Name, ABBR),后续裸缩写;用abbreviation_registry.py管理;需生成前置缩略语表。细则见## Abbreviation Contract。 - 三线表格式强制:所有数据表使用 Markdown 管道语法,
markdown_to_docx.py自动转换;边框参数与题注字体字号见references/word-format-spec.md § Three-Line Table Borders。细则见## Table Contract。 - 文风约束:见
## Humanization Contract(清单集中在那里);check_quality.py check_writing_style()自动检测。硬禁清零项:破折号(——)/scare quotes/解释性冒号三项标点 + AI 禁词,finalize 前必须归零。软提示项(不阻断 finalize):句长/句式节奏(C 降软)。 - 格式对齐规则:正文两端对齐、三线表单元格居中、图占位符居中无首行缩进。完整参数见
references/word-format-spec.md。 - Bold marker 处理:
**text**/__text__在 Word 转换时由md_runs.inline_md_to_runs()解析为真正的粗体 run;单*统计显著性标记(如*p<0.05)由其内置保护规则保留原样。 - 已发表 SCI 内容复用合规底线:
- 正文复用必须改写为中文学术表述,不得直接翻译粘贴。
- 每章首次复用处必须标注来源文献(正文引用 [N] + 声明"本章部分内容已发表于 [N]")。
- 复用成果须同时体现在"攻读学位期间取得的成果"清单与"独创性声明"中。
- 缺标注的已发表内容复用等同未注明引用,触发学位办自我抄袭/重复发表红线。
- 本技能不做查重,改写 ≠ 降重:技能只把英文材料改写成中文学术表述并做文风/翻译腔软检测,不计算重复率、不对接知网/万方/Turnitin。是否达标须用户自行送第三方查重系统核验。
- 逐段"原文-改写"对照表(人工产出):凡复用已发表 SCI 内容的段落,须在
docx/reuse_map.md(或交付附件)中逐段列出对照表,列:所在章节 / 原文出处 [N] / SCI 原文片段 / 中文改写文本 / 改写状态(confirmed/pending),供用户自查重复率与送查重。
Citation Zero-Hallucination Gate (Mandatory)
Before writing any chapter section and before final full-thesis merge, run:
python3 scripts/citation_guard.py --index "${save_path}/literature_index.json" --mcp-cache "${save_path}/mcp_literature_cache.json" --mcp-ttl-days 30 --write-back --manual-review "${save_path}/manual_review_queue.json" --log "${save_path}/verification_run_log.json" --report "${save_path}/citation_guard_report.json"
--write-back 由脚本把每条 verified 与 verification_details.checked_at 落回 literature_index.json(AI 不手动改 verified)。据此下一轮核验对已 verified 且未过 TTL 的条目自动短路复用、跳过在线重验;sci-source-seed 种子(verified=false)与过期/未验条目照常走完整在线核验,撤稿与新鲜度安全不受影响。报告字段 reused_fresh_verified_count 记录本轮命中短路的条目数。
Rules:
- Immediately after each retrieval/import batch updates
literature_index.json, run the guard once before any drafting. - If guard exits non-zero or report
ok=false, stop writing and resolve the queue first. - When bidirectional verification fails (
title_mismatch|doi_invalid_or_unresolved|pmid_invalid_or_unresolved|id_mismatch), setverified=falseimmediately and route entry tomanual_review_queuefor manual confirmation before正文引用. - Unverified references must not be cited in chapter markdown.
- Every cited entry must carry traceability fields (
source_provider+source_id) and DOI/PMID whenever available.
Topic-dependent routing (MANDATORY):
- Life science / medicine / clinical / biochemistry / pharmacology → PubMed CLI first (
esearch/efetch/einfo,~/edirect/, requires< /dev/null, proxyhttp://127.0.0.1:<PROXY_PORT>). Auto-install if missing:sh -c "$(curl -fsSL https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/install-edirect.sh)". Windows: edirect 在 Windows PowerShell/CMD 不可用,用 WSL bash,或自动回退 paper-search MCP。 - CS / AI / engineering / physics / interdisciplinary → paper-search MCP first (
mcp__paper-search-mcp__search_arxivetc.). - Fallback to the other source when primary yields no results.
跨平台命令说明: 本文档内联的
python3 scripts/xxx.py命令在 Windows 上用python或py代替python3。
literature_index.json 必需字段 schema 见 references/format_profile_schema.md § literature_index.json schema。
- Source provider policy is strict:
- Allowed:
pubmed-cli(life science primary),paper-search(CS/AI primary / fallback / preprints). - Forbidden:
websearch,openalex-cli(pyalex),tavily。citation_guard.py以source_provider_not_allowed拒绝这些来源。 - 无 DOI/PMID 的条目不予放行,进入
manual_review_queue人工核实。 - Serial Search (MANDATORY): Execute all retrieval calls sequentially. Never parallelize. Enforce ≥1s interval between consecutive calls.
- Citation Type by Context (MANDATORY):
- Background / field overview → Reviews or Systematic Reviews preferred.
- Specific mechanistic/experimental claims → Original Articles (do NOT substitute a Review as the sole support).
- Clinical efficacy/safety claims → Clinical Trials.
- Emerging/cutting-edge claims → Preprints (label as [Preprint]; only when no peer-reviewed equivalent exists).
- Allowed:
- This guard does not change existing chapter writing workflow; it only validates reference correctness.
- For final delivery strict mode, run with
--require-mcp.
Citation Claim Check (承重论点↔引文)
citation_guard.py 只验引文真实性(DOI/PMID/标题对得上);它不判「这篇引文到底支不支持它挂着的那句论点」。写研究章时,对承重论点句(机制/因果/关键定量结论)↔ 其引文,必须再过一道引文核证:
literature_index.json每条可选带key_finding(该文献真实结论一句话)与claim(本文用它支撑的论点)两字段,最小承载核证语义(schema 见references/format_profile_schema.md § literature_index.json schema)。- 写某研究章前,对每个「承重论点句 ↔ 引文」建一行证据,落
claim_evidence.json(list),字段{section, claim_sentence, is_load_bearing, ref_id, retrieved_abstract, verdict∈support/weak/contradict/unknown, evidence_quote, user_confirmed}。retrieved_abstract用检索到的真实 abstract(不看可编的key_finding),取 abstract 走本技能既有文献检索subagent。已建过证据的可留空以省事:脚本读写ref_evidence_cache.json,对某条ref_id已缓存过 abstract 的行自动回填 abstract、AI 不必重新检索;同一(ref_id, claim_sentence)已判定过的行自动复用上次结论,AI 只需对新的 (文献, 论点) 组合做反向验证。 - 跑共享核证脚本(
env_preflight.py打印的CITATION_CHECK_CMD),命令python <sci2doc>/scripts/citation_claim_check.py --root <project_root> --evidence <project_root>/claim_evidence.json。脚本自动读写ref_evidence_cache.json(回填 abstract + 复用同 (文献,论点) 已确认结论),门禁强度不变。- 承重句
verdict∈{contradict,unknown}或缺 abstract 或未user_confirmed→ fail-closed(exit 2),硬拦 + 人工逐条确认后方可下笔。 - 背景陈述句只在表里批量呈现、不逐条阻断。
- 承重句
- 纳入节/章 DoD(见 dod_checklist
section-dod/chapter-dod的 citation_claim_check 项)。
Single Source of Truth
论文目标配置存于 thesis_profile.json;样式选择与格式门禁存于其 format_profile;运行时状态镜像在 project_state.json。自定义要求不完整时 progress.status 必须为 pending_template(导出硬门禁见 ## Style Selection Gate)。
format_profile 完整字段清单、结构化更新入口(--format-profile-json / --project-info-json)、页码格式枚举、需求→字段映射规则、project_info 字段,均见 references/format_profile_schema.md § Single Source of Truth。
Project Directory Structure
After init, the project root contains exactly these directories and files. Do NOT create any directories outside this list.
${save_path}/
├── atomic_md/ # 原子化 markdown(唯一写作源)
│ ├── 第1章/
│ │ ├── 1.1_引言.md
│ │ └── ...
│ ├── 第2章/
│ └── 缩略词表.md
├── 02_分章节文档/ # 单章 docx 输出(merge --to-docx)
├── 02_分章节文档_md/ # 单章 md 合并中间产物
├── 03_合并文档/ # 全文 docx 输出(merge-full --to-docx)
├── 03_合并文档_md/ # 全文 md 合并中间产物
├── 04_图表文件/ # 图表描述文件 + 自定义格式模板证据文件(AI/用户手动放置)
├── scripts/ # 技能脚本副本(init 自包含拷入;SKILL 命令 `python3 scripts/xxx.py` 即指向此处)
├── materials/ # 原始材料素材档(material_ingest.py 生成,可选)
│ ├── materials_archive.json # 素材总索引
│ └── <name>.md # 每材料一个结构化素材档
├── .state/ # gate-check 状态
├── backups/ # 快照备份 / section-snapshot(自动创建)
├── project_state.json # 项目状态
├── thesis_profile.json # 论文配置
├── context_memory.md # 运行时上下文记忆
├── chapter_index.json # 章节结构索引
├── literature_index.json # 文献引用索引
├── figures_index.json # 图表引用索引
├── figure_map.json # SCI图号→论文图号映射(自动生成)
├── history_log.json # 操作历史
├── abbreviation_registry.json # 缩写注册表(自动生成)
├── mcp_literature_cache.json # MCP 文献检索缓存(citation_guard 自动生成)
├── citation_guard_report.json # citation_guard 运行报告(自动生成)
├── manual_review_queue.json # 待人工核验引用队列(citation_guard 自动生成)
├── verification_run_log.json # citation_guard 运行日志(自动生成)
└── references_rendered.md # GB/T 7714 著录渲染输出(reference_renderer 自动生成)
Anti-Drift Rule (Mandatory)
AI must only create or write files into the directories listed above. Any artifact that does not fit an existing directory is a workflow violation. Do not create directories outside this list.
Prewrite Memory Loading (Critical)
When write-cycle runs, load_state automatically loads:
project_state.json:project metadata, progress, and outline(含研究主线scientific_question+ 各章core_argument,是写作一致性的锚点)chapter_index.json:chapter structure with section titles (filtered to current chapter)literature_index.json:references (filtered to current chapter)figures_index.json:figures/tables (filtered to current chapter)
A① 跨章综合例外: 当前章为绪论(绪论/引言)或结论(结论/总结/小结/展望)时,
load_state不按当前章过滤,而是全量加载 chapter_index / literature_index / figures_index + 全部研究章的 section digest/key_facts(bundle.synthesis_role=intro/conclusion,scope=cross-chapter-synthesis)。这样绪论能综述全部研究、结论能跨章综合各研究章的真实数据,避免缝线全露。章类型由project_state.json.outline里该章标题判定。引文核证不整批重验:绪论/结论引用的文献若已在某研究章验过(承重论点↔引文那道核证),citation_claim_check.py经ref_evidence_cache.json自动复用该 (文献, 论点) 的既有 abstract 与确认结论,AI 不必对全量引文手动重记证据;只有新出现的 (文献, 论点) 组合才需反向验证,fail-closed 不放松。
context_memory.md:timestamped operation summarieshistory_log.json:recent operation eventschapter_section_digests:lightweight digests extracted from existingatomic_md/第N章/*.mdfiles
Item 7 is the cross-section consistency mechanism. It does NOT load full markdown content (that would blow the token budget). Instead, it extracts only:
- Headings (section structure)
- Table captions (表 X-X:...)
- Key experimental facts (grouping, reagents, concentrations, methods, max 10 per section, 80 chars each)
- Character count (progress tracking)
This gives the AI enough context to avoid contradicting earlier subsections (e.g. wrong experimental design, wrong reagent lists) without consuming significant tokens.
AI Responsibility: Update chapter_index.json
After writing each subsection, the AI must update chapter_index.json with key facts from that section. This is the primary structured memory that persists across sessions. The digest mechanism is a safety net, not a replacement.
Example entry:
{
"chapter": "2",
"section": "2.1",
"title": "实验材料与试剂",
"key_facts": ["PMG浓度梯度: 0, 5, 10, 20 μg/mL", "细胞系: HepG2, LO2", "Western blot检测蛋白表达"],
"tables": ["表 2-1:主要试剂及来源", "表 2-2:主要仪器设备"]
}
Rule: Never skip write-cycle before writing a new subsection. It is the only mechanism that loads cross-section memory.
Required Workflow
0) Material Input Gate (Mandatory)
Degree & target confirmation (must ask before anything else):
AI must ask the user two questions before proceeding:
- Degree type: doctoral (博士) or master's (硕士)?
- Body word count target: defaults are doctoral ≥50,000 / master's ≥30,000; confirm or let user specify a different number.
Record answers into thesis_profile.json > format_profile.degree_type and targets.body_target_chars during init / profile step. Do not proceed to material extraction until both are confirmed.
Before initializing any project, also verify:
- Source materials (PDF/Word SCI papers + supplementary figures) are accessible at a known local path.
- User has provided: thesis topic, research chapter count estimate, target university (or explicit consent to use the built-in default template).
If source materials are missing or inaccessible, stop and request them. Do not proceed to Step 1.
[可选] 多格式原始材料落盘: 若用户除 SCI 论文外还提供了其他原始材料(实验数据 Excel/CSV、组会笔记 md、参考 PDF/Word、结果图片等),在提取 SCI 论文文本前先运行材料落盘脚本,把素材分析写进 materials/ 目录,供后面按章写作时引用取证:
python3 scripts/material_ingest.py --dir /path/to/raw_materials --save-path "${save_path}"
# 或指定文件列表:--list file1.xlsx file2.md fig1.png
落盘完成后,materials/materials_archive.json 为素材总索引,每个材料对应一个 materials/<name>.md(含可引用要点、表结构/数值范围、图片待确认标记)。后续写作时,引用数值/结论必须能追溯到对应 entry,不得凭空生成。图片类材料标记 pending_confirm,须等用户口述或补充图内容后方可引用。详细规则见 references/material_ingest_guide.md。
SCI 论文内容提取(必做): 确认材料可访问后,在进入 Step 1 前,必须将 SCI 论文内容提取为可读文本:
- PDF 格式 → 使用
/pdfskill(pdf-viewer:view-pdf)逐页阅读,或在用户本地运行:
若 pdfminer 未安装:# 使用 pdfminer 提取(无需联网) python3 -c "import pdfminer.high_level; print(pdfminer.high_level.extract_text('paper.pdf'))" > paper_text.txtpip3 install pdfminer.six - Word 格式 → 使用
/docxskill 或直接 Read 工具读取文件内容 - 网络来源(DOI 可访问) → 使用
/fetch-everythingskill 抓取全文
[docx/pdf 源稿] 内嵌图抠出(必做于 atomic_md_workflow 之前): 支持 docx 与 pdf,运行下面这一步把内嵌图按出现顺序解到 figures/,供后续按章节嵌图与 figure_registry.py 使用(pdf 需 PyMuPDF,缺失则优雅跳过;其他非 docx/pdf 输入自动 no-op,安全可重复运行):
python3 scripts/extract_docx_images.py --manuscript /path/to/source.docx --project-root "${save_path}"
产出:figures/figure_NN.<ext> + figures/image_manifest.json。脚本只搬运二进制,不做 OCR / 图像识别;图片对应到章节图号的映射仍走 figure_registry.py 注册流程。
提取完成后,AI 应先通读全文摘要(Abstract)、结果(Results)、方法(Methods)三节,大致读懂做过哪些实验,再进入 Step 0.5。
SCI 自身参考文献导出(初始种子): 在通读的同时,同步扫描源 SCI 论文的 References 部分,将其中每条参考文献按 literature_index.json schema 格式整理为初始种子条目,source_provider 填 "sci-source-seed",verified 填 false,写入项目的 literature_index.json(若文件已存在则 merge 而非覆盖)。这些种子作为 Step 3 文献检索的待核验候选清单(已带 DOI/PMID,省去重新构造检索式、确定检索目标的成本),而非可直接引用的来源。注意:sci-source-seed 不在 citation_guard.py 的合法 provider 白名单(pubmed-cli / paper-search)内。种子条目必须在 Step 3 以其 DOI/PMID 为目标经 pubmed-cli 或 paper-search 正式检索核验,核验通过后将 source_provider 更新为实际核验来源并置 verified=true,方可引用;未核验的种子不得进入正文。
以下各步只列命令名 + 关键参数 + 门禁条件。完整可复制 CLI(含所有 flag、占位符)见
QUICK_START.md。
开场监工卡(每次启动本技能必须原样打印给用户)
学位类型与源材料确认之后、产出章节结构之前,AI 必须 把下面这张卡原样打印给用户。这是把 sci2doc 最容易翻车的地方摊到明面上,请用户当监工,别当甩手掌柜。
【sci2doc 监工卡 · 请你盯这几件事】
1. 数据不许编:为凑字数(博士≥5万字/硕士≥3万字),AI 最爱把实验数值编圆。
每写一章,找我要一张"数值→原文哪张图/表"对照表,你随机抽 2-3 个数回原文核对。
2. 一章一章写,别一次甩全文:要求逐章交付。一次性生成整篇会跳过所有逐节质检和盲检,
看着完整实则没过任何门。你发现我在批量出全文,立刻喊停。
3. 本技能不查重,改写≠降重:复用已发表 SCI 段落时,找我要"逐段原文-改写对照表"
(章节/原文出处/SCI原文/中文改写/状态),你自己拿去知网/维普送查,别信"已改写"三个字。
4. 引文抽验 DOI:从参考文献里随机挑 3-5 篇,让我给出 DOI/PMID,你上 doi.org 点开验真伪。
5. 章节结构要你亲自签字:下面的"研究主线/章节结构"必须你确认后我才落签字解锁正文,
我不会替你确认。没签字,正文写入会被门禁物理拦下。
若开工前置的
env_preflight.py报门禁状态为degraded(当前环境不透传 hook)→ 明确告诉用户"本环境无法强制拦截,上面 5 条全靠你人工盯"。
0.5) Research Storyline Design (Mandatory)
执行时机: Step 0(材料确认 + 内容提取)完成后、Style Selection Gate 前执行。
通读 SCI 论文材料的 Abstract / Introduction / Results / Discussion 后,AI 必须与用户共同确定"研究主线"并产出下表,写入 project_state.json 的 outline 字段(每章一条记录)再进入 Step 1。
强制产出:科学问题 → 贡献映射表
| 字段 | 说明 |
|---|---|
scientific_question |
全论文核心科学问题(一句话,来自材料,不得自造) |
chapters[] |
每章:章号、章名、对应 SCI 论文/图组、本章核心论点、承载主要内容(300字以内) |
contribution_map |
各 SCI 来源 → 对应章节(避免章节撞题) |
写入格式(project_state.json outline 数组,每条一章):
{
"chapter": 2,
"title": "XX对XX的影响",
"sci_source": "Paper A, Figure 1-3",
"core_argument": "XX通过XX机制发挥XX作用",
"estimated_content": "材料方法+结果讨论,主实验3个,预计图表各3"
}
🔴 门禁(阻断 Step 1): outline 数组为空时不得进入 Style Selection Gate。outline 必须包含:scientific_question(顶层字段)+ 所有研究章条目(含 sci_source 和 core_argument)。
章节字数协商在此阶段完成(不在 init 后): 基于各章实际承载内容(实验数量/图表数量/方法复杂度),与用户协商每章字数目标,写入 profile 的 chapter_targets,再执行 Step 1 init。
[章节结构签字·强制门禁落锁] 用户在对话里明确确认上面的研究主线 / 章节结构映射表后(且仅在此之后),运行开局
env_preflight.py打印的那条SIGNOFF_CMD(已含解析好的绝对路径)落盘签字。注意env_preflight.py在会话开场就运行(即本 Step 0.5 签字之前,见本文件开头第 1 条握手;它文档虽列在 Step 1,实际执行在最前),所以此刻SIGNOFF_CMD早已拿到,不存在签字时还没拿到命令的次序歧义:即python "<sci2doc>/scripts/structure_signoff_gate.py" confirm --root <项目根> --note "<用户确认原话摘录>"。这一步解锁正文写作:未落签字,PreToolUse hook 会在工具层拦下(deny)任何对atomic_md/*/*.md(学位论文各章正文)的写入(这是防跳步的硬门,不是提示词纪律:写文件类工具一律 deny,经 shell 的写入另有一条 Bash 钩子拦,任何绕行都会记进项目根的.academic_gate_audit.jsonl供用户复核)。这道拦截 hook 由env_preflight.py开工时经本技能scripts/install_gate_hook.py(vendored)自动安装并校验,它先把门禁四件套部署到~/.claude/academic-gate/(稳定位置,不随技能目录增删而动),再让settings.json的 hook 指向那里,单独分发的技能也能自装(带备份与回滚),门禁状态 active 即在岗;若报 degraded / error(如缺_shared),拦截层不在岗,签字仅留痕、无强制,需人工守住「未签字不写正文」。若后续章节结构又改,改完让用户重新确认并重跑本命令覆盖签字。签字与它签的那份大纲绑定:节号/标题/层级/顺序任一变化(含只增不删的细化扩展),下次写正文会被门禁拦下并逐条列出哪几节变了,须由用户重新确认后重跑本命令;进度、统计、时间戳这类变动不触发重签。⚠️ 严禁在用户未确认时自行运行 confirm,那等于伪造用户签字。注意:本签字闸管的是章节结构确认,与
## Style Selection Gate(样式/格式确认,阻断 init 与 docx 导出)是两道独立的门,各管各的,别混淆或相互替代。
1) Initialize Project
- Env Precheck(软门禁,建项目文件前):
python3 scripts/env_preflight.py ${save_path} --cli esearch --py docx,写env_status.json,末行PRECHECK: OK|ASK|BLOCKED。BLOCKED(Python 过低)→ 停并引导升级;ASK(缺 git/esearch/python-docx 等可选工具)→ 逐项问用户是否安装并给指引,用户答"已装/不装"后才继续,后续再遇缺工具同此处理;OK→ 继续。 - Git Init(叠加在 snapshot 之上):
python3 scripts/git_checkpoint.py init ${save_path}。git 可用且项目根不在他人仓库内时建 git 检查点,否则静默回退 snapshot。 state_manager.py init:先二选一样式。--format-mode default_generic或--format-mode custom(+--university-name/--degree-type/--template-source/--missing-requirement)。state_manager.py profile --show验证;render-front-matter手动重渲前置页;profile --body-target/--abstract-min/--chapter-target ...写入已协商好的各章字数目标(应在 Step 0.5 中已与用户确定)。- 自定义结构化布局字段不全 → 保持
pending_template(最小必填字段见## Style Selection Gate)。 - init / profile 必须自动刷新 managed front matter;无 managed marker 的用户改写文件不得覆盖。用户在聊天里给的详细要求应转成 JSON 经
--format-profile-json/--project-info-json写入,而非仅留在 prose memory。
2) Prewrite Gate (Mandatory)
state_manager.py write-cycle --chapter N --token-budget 6000 --tail-lines 80 --json-summary。每章每节必跑,加载跨章记忆。
3) Atomic Subsection Writing
- 🔴 开写前置闸门 (Mandatory,脚本硬拦截):每节开写前必须先跑
python3 scripts/prewrite_gate.py --section X.Y --root .(X.Y 为章.节,如 2.1),exit≠0 禁止开写。它统一硬检查:上一节完成(同章编号紧邻上一节atomic_md/第N章/{X.Y-1}_*.md存在非空)、大纲就位(project_state.json.outline含本章 +chapter_index.json)、素材就位(figures_index.json本章有图表/实验映射条目,无则降级 warning)、上一节占位符清零(无CITE_PENDING/DATA_PENDING/【待);上一节盲检结果(.review_pass/<上一节>.json)缺失即 prewrite_gate 硬拦 exit 1,禁止开写;必须先跑 delegate_review verify --section <上一节> 落盘通过标记。⑥ 数据溯源硬门:prewrite_gate 还会对上一节跑data_trace_gate:上一节含实验数值却无有效[数据来源] materials/<档>#<字段>标记(或标记指向不存在的素材档/字段)即硬拦 exit 1(堵编数据)。 - 盲检逃生口(仅盲检子代理不可用时):本环境派不出独立盲检子代理(平台无 academic-blind-reviewer 或子代理反复失败)才可加
--allow-manual-review "<非空理由>",对上一节或上一章章级盲检做显式人工放行。它只放行这两处盲检项,上一节文件/大纲/占位符/data_trace 等其余硬门照常拦。放行会写.review_pass/<sec>.json(manual:true+理由+时间戳)并追加.review_pass/MANUAL_REVIEW_AUDIT.log留痕,绝非静默跳过;理由为空即拒绝放行。用了此逃生口等于承认盲检未做,须请用户亲自复核数据溯源与章节逻辑。 - 🟢 本节正文由撰写子代理盲写(主会话调度,堵上下文爆 + 焊死编号权):prewrite_gate 通过后,本节正文不再由主会话直接手写,改走下面这条流水线(前后所有门禁一个字不改,照跑):
- 组任务包:
python3 scripts/delegate_write.py pack-write --section X.Y --root .→ 生成.write_task_X.Y.json(本节大纲/承重方向 + 已核证观点-证据对certified_claims+chapter_matrix切给本节的文献全条 + 缩写表 + 风格禁项嵌入,全篇大纲/全库文献只给refs路径)。承重句未完成人工核证 / 本节有承重论点却缺claim_evidence→ 脚本 exit 2 拒绝出包(先补核证)。 - 派撰写子代理:把
references/section_writer_prompt.md(角色 prompt + 数据/指令隔离声明)+ 任务包路径交给一个全新一次性上下文子代理,让它盲写本节。它只写.write_return_X.Y.json,正文引用只写[@key](绝不写裸数字[5]),承重句只准挂任务包内嵌certified_claims里的ref_key,禁写任何账本。 - 机械校验返回:
python3 scripts/delegate_write.py verify-write --section X.Y --root .(V1-V9:无裸数字引用 /[@key]可解析 /new_refs带 DOI 或 PMID /section_id一致)。exit≠0 打回子代理重写,不落盘。 - new_refs 先核验再并表(账本零污染):对返回的
new_refs先citation_guard.py --require-mcp核真伪,通过的才python3 scripts/citation_renumber.py merge-refs --root . --return .write_return_X.Y.json去重并表(DOI→PMID→归一标题)+ 分配稳定 id + 同步 upsertchapter_matrix。核验失败的直接丢弃、打回子代理改写该处引用。 - 落盘正文(主会话已结构签字,hook 放行)到
atomic_md/第N章/,随后照跑机械审(citation_claim_check复核承重句、data_trace_gate、缩写、索引更新)。
- 白名单琐节(front/back-matter、无承重论点清单的节):主会话就地写、不派子代理。
- 试点期说明:备料子代理与
article_type落库属推广批未上;本期承重核证走主会话就地建claim_evidence.json、引用类型纪律走本 prompt + 盲检兜底。
- 组任务包:
- 正文
[@key]是长期真源,[N]是章末派生:原子 md 一直保持[@key];章末合并前跑python3 scripts/citation_renumber.py renumber --root . --chapter N --check(exit≠0 若有未并表new:键 / id 冲突 / 未知键)通过后再--in-place把[@key]统一翻成连续[N](按reference_renderer.citation_sort_key同一排序,保证正文[N]与参考文献列表逐一对应)。 - 文件存于
${save_path}/atomic_md/第{chapter}章/,命名{section_number}_{section_title}.md(如2.1_研究对象.md)。 - Table reminder:呈现结构化数据(试剂/仪器/分组/统计)的小节 必须 用 Markdown 管道表,见 Table Contract,不得用散文描述。
- 校验:
atomic_md_workflow.py validate --chapter N(加--enforce-research-structure)+validate-experiment-map --chapter N。门禁: 编号断裂 → 修复后才能继续。 - ⑥ 数据溯源标注(写作时必做,堵编数据):凡写入实验数值(浓度/剂量/比率/统计量等),该处必须紧跟标注
[数据来源] materials/<素材档>#<字段>,指向真实materials/*.md素材档里承载该数值的字段。落盘后自查python3 scripts/data_trace_gate.py --section X.Y --root .,exit≠0 必须补标或删除无源数值,追溯不到 materials 的数值就是编的,不得留在正文。 - Post-write 必做:
abbreviation_registry.py process --file ... --in-place,然后更新chapter_index.jsonkey_facts(AI 责任),再进 Step 4。
4) Subsection Summary Snapshot
atomic_md_workflow.py section-snapshot --chapter N --section X.Y。每节小结完成即快照。- Git Checkpoint:
python3 scripts/git_checkpoint.py commit ${save_path} "[sci2doc] section X.Y done"(git 不可用自动 no-op,snapshot 仍兜底)。
🔴 每节收口自检清单(Definition of Done · 节级)
硬规则:以下各项未逐一确认通过,不得向用户声明"该节完成"。
🔴 进入下一节前置闸口:上一节 delegate_review verify 必须 exit 0(含结构完整性项 S6),否则不得开始下一节。写完即检,不过不进。
🔴 修复 3 次仍不过 → 回滚兜底:同一节/章据盲检证据修复重跑 3 次仍 fail,停止盲目重写,提示用户回滚到上一检查点(git 可用 git checkout <sha> -- <文件>;否则 state_manager.py rollback --target snapshot)后重写。
🔴 委托盲检(不得主 agent 自评):落盘前必须把 DoD 清单委托给独立上下文的subagent盲检,自己不直接打勾:
- 生成任务包:
python scripts/delegate_review.py pack --checklist references/dod_checklist.json --gate section-dod --files <本节文件> - 派一个独立subagent(Claude Code 用
academic-blind-reviewer;其他平台派通用subagent),把任务包原样给它、不要给它本节的写作上下文,要求按任务包返回 JSON 数组。 - 校验返回:
python scripts/delegate_review.py verify --checklist references/dod_checklist.json --gate section-dod --return <subagent返回.json> --section <当前节号如3.2> --root <项目根>;退出码非 0(任一缺项/fail/无证据)= fail-closed,据subagent证据修复后重跑,未过不得声明完成。verify 通过会落盘.review_pass/<当前节号>.json,下一节prewrite_gate.py会硬校验它(缺失即拒绝开写)。
⚠️ 若环境派不出真正独立的subagent,绝不能同一 AI 自问自答冒充盲检。告诉用户「本环境盲检不可靠,请你亲自复核数据溯源与章节逻辑」,交回用户。
🔴 ①DoD停(盲检通过后必须停一次):section-dod 盲检 exit 0 后,不得直接开写下一节。先把该节 DoD 逐项结论(每项 pass/证据一行)摆给用户,并**HALT 等用户明确说"过,继续下一节"**才动笔。用户未确认前停在此处。
本节完整 DoD 判据(全部核查项 + 脚本命令)以 references/dod_checklist.json gate=section-dod 为唯一真源(20 项):盲检subagent据此逐项核、能脚本核的先跑脚本,退出码非 0 即 fail-closed。含 G1-G6 通用(编号连续/citation_guard/主线对齐/占位清零/去AI 硬禁三项标点/字数软目标)、S1-S5 sci2doc 特有(实验-方法映射/一实验≥一图表/三线表/缩略语首展/自我抄袭标注)、S-GIT 检查点,及 S6 结构完整性、S10 数据溯源硬门(含数值却无 [数据来源] 标记=编数据嫌疑,fail-closed)、S11 承重引文核证,与 C1 科学事实正确 / I1 论证逻辑闭环 / O3 工作量与原创性 / O4 中英摘要对应 / M3 伦理合规披露 五项盲检质量核。此处不再内联清单,避免与真源 drift。
5) Merge Chapter Markdown and Convert
atomic_md_workflow.py merge --chapter N --to-docx。- 硬门禁:
format_profile.status == pending_template时markdown_to_docx.py拒绝生成.docx,不得手动绕过转换器。
6) Chapter Self-Check (Immediate)
atomic_md_workflow.py self-check --target ".../02_分章节文档/第N章_自动合并.docx"。- 章节自检按
chapter_targets判断,不卡全文参考文献下限(在全文总检卡)。pending_template时check_quality.py同样拒绝格式验收(同 Style Gate 导出门禁)。
🔴 每章收口自检清单(Definition of Done · 章级)
硬规则:以下各项未逐一确认通过,不得向用户声明"该章完成",不得进入 Step 7。
[数据溯源·用户必抽验] 学位论文里每个实验数值/每张图都必须能在原始 SCI 里找到出处。每写完一章,让 AI 给一张"本章数值/结论 → 源自原文哪张图/哪段"对照表,用户抽查几行(
data_trace_gate.py已机械校验[数据来源]标记,⑥)。⚠️ 字数目标已降为软目标(A③/C 降软,综述/绪论并入正文减压),就是为了不再逼 AI 靠编数据/扩实验凑字,追溯不到 materials 的数值就是编的。引文同样抽几篇验 DOI。
🔴 进入下一章前置闸口:上一章 delegate_review verify 必须 exit 0(含章结构完整性项 S8),否则不得开始下一章。写完即检,不过不进。现在 prewrite_gate.py 已对这道闸口硬校验,不再只靠提示词纪律:写下一章首节(如第 N 章的 N.1)前,它会读 .review_pass/第<N-1>章.json,缺标记或未 passed 即 exit≠0 硬拦。前提是上一章 chapter-dod 盲检已用 delegate_review.py verify --section 第<N-1>章 落盘通过标记。第 1 章首节无上一章,放行。
🔴 委托盲检(不得主 agent 自评):章级闸口同样委托独立subagent盲检,不得主 agent 自评:
- 生成任务包:
python scripts/delegate_review.py pack --checklist references/dod_checklist.json --gate chapter-dod --files <章节合并文件> - 派一个独立subagent(Claude Code 用
academic-blind-reviewer;其他平台派通用subagent),把任务包原样给它、不要给它本章的写作上下文,要求按任务包返回 JSON 数组。 - 校验返回:
python scripts/delegate_review.py verify --checklist references/dod_checklist.json --gate chapter-dod --return <subagent返回.json>;退出码非 0(任一缺项/fail/无证据)= fail-closed,据subagent证据修复后重跑,未通过不得进入 Step 7。
🔴 ①DoD停(盲检通过后必须停一次):chapter-dod 盲检 exit 0 后,不得直接开写下一章。先把本章 DoD 逐项结论(每项 pass/证据一行,含数据溯源 S10、承重引文核证 S11)摆给用户,并**HALT 等用户明确说"过,继续下一章"**才动笔。用户未确认前停在此处。
本章完整 DoD 判据(全部核查项 + 脚本命令)以 references/dod_checklist.json gate=chapter-dod 为唯一真源(19 项):盲检subagent据此逐项核、能脚本核的先跑脚本,退出码非 0 即 fail-closed。含 G1-G7 通用(编号/citation_guard/主线/占位/去AI/字数/G7 常识软报告)、S1-S7 sci2doc 特有(实验-方法映射/一实验≥一图表/三线表/缩略语注册/GB7714 著录/自我抄袭/章后 self-check)、S9 字符级排版(subsup_bare + halfwidth_punct_in_cn + english_misspelling 任一命中即 check_quality.py 非零退出 hard 阻断)、S-GIT 检查点,及 S8 全章结构完整性、S10 全章数据溯源硬门(数值均标 [数据来源],fail-closed)、S11 全章承重引文核证。此处不再内联清单,避免与真源 drift。
7) Finalize Chapter State
state_manager.py write-cycle --chapter N --finalize --summary "..." --snapshot。- Git Checkpoint(章末):
python3 scripts/git_checkpoint.py commit ${save_path} "[sci2doc] chapter N done"(git 不可用自动 no-op)。
8) Merge Full Markdown and Full Word
atomic_md_workflow.py merge-full --to-docx。规则: 必须先纳入atomic_md/根级前置页 markdown,再合并正文。- 可选高保真合并:
merge_chapters.py --input-dir .../02_分章节文档 --output .../03_合并文档/完整博士论文.docx --require-high-fidelity。 - 兼容规则:
merge_documents.py优先用02_分章节文档/中已物化的前置页 docx,默认纳入封面、题名页、独创性声明与授权书。
9) Full Thesis Checks
字数:
state_manager.py word-count或count_words.py <路径>(支持 .md / atomic_md 目录)。全文质检:
check_quality.py "${save_path}/03_合并文档/完整博士论文.docx" --output json --enforce-full-structure --md "${save_path}/03_合并文档_md/完整博士论文.md" --md-checks xref。--md-checks xref是必带的窄口:md 侧只放行交叉引用类,其余 12 类未验证检查(占位标记会逐条命中 sci2doc 自己强制的[图]/[表]/[实验]标记,30 图博论 −30 分)会把总分压穿 80 线、让退出码因与交叉引用无关的理由翻 1。交叉引用断链门(A5·HALT 交用户裁决·与参考文献门并列):全文质检 JSON 的
issue_summary.xref_broken > 0→ HALT,列出每条断链的行号 + 原文引用切片 + 指向的编号(issues[]里code=="xref_broken"的条目),交用户逐条裁决(补被引图表/章节、改错编号、或判为假阳忽略),处置后重跑本步至xref_broken == 0再放行导出。断链只是 warning(−3 分)、不是硬阻断 code:A5 是启发式提取,硬拦一次假阳就卡死全文总检,故退出码语义不因它改变,靠 HALT 交人工。- ⚠️ 已知局限(须向用户交代,方向为宁漏报):① 节/章级引用必须带引导词才被识别(
参见|详见|另见|参阅|见),按2.3节所述、如3.1节所述、同3.2节方法这类无引导词句式全部漏检(真稿实测 21 条节级引用 100% 漏检)——xref_broken == 0不等于全稿引用都有效,只代表"带引导词的那些"没断。本轮有意不扩这个正则:扩了会把大量正文里偶发的"第3节/2.3节"当引用,假阳一起来就得逐条人工排,宁漏勿假阳。② 题注写成 markdown 标题(### 图2-1:题注)或落在代码围栏里时,题注行被跳过 → 该图表进不了目标集合 → 引用它的每一处都变断链(概率低但触发即全量假阳:真稿变体实测 39/39 条引用全部误报)。sci2doc 自家题注约定([图] 图2-1:…独立成行)不落在这个形状,但用户手改过题注格式就可能踩到——HALT 清单里若出现"整章/全稿引用集体断链",先怀疑题注格式,别逐条改编号。③ 代码围栏用了~~~——脚本只认三反引号那种围栏,~~~包起来的内容不会被跳过,块里举例写的"见图9-9"会被当成正文里的真引用 → 假阳报断链(学位论文里极罕见)。规避:代码块统一用三反引号围栏。
- ⚠️ 已知局限(须向用户交代,方向为宁漏报):① 节/章级引用必须带引导词才被识别(
参考文献两道门:全文总量
references_min_count(默认 ≥80)为硬门(error,阻断)。另有按章软门(warning,不阻断,阈值在thesis_profile的per_chapter_ref_floor,硕/博分档,硕地板低于博):绪论/文献综述章[n]引用偏少、研究/实验章引用偏少各自提示补充,结论章不设地板。软门只提醒不阻断导出。数值一致性核查(三层·与参考文献门并列·HALT 交用户裁决):数值矛盾跨章(摘要 vs 结果 vs 三线表),必须全文级(不挂 Step 6 章级自检,章级只管数值有无
[数据来源]标记)。读 Step 8 合并产出的03_合并文档/完整博士论文.docx(中文博论,大量三线表 → docx 表格 walk 是头号用例,numeric_candidates.py已额外遍历doc.tables抽单元格值location.source=="table")。① 第 1 层确定性锚:
python scripts/numeric_candidates.py --manuscript "<项目根>/03_合并文档/完整博士论文.docx" --project-root "$WORKROOT"→ 产$WORKROOT/numeric_candidates.json。② 第 2 层独立检测子代理(非作者自检·I2):派一个 fresh context、没参与撰写的独立检测子代理(
TaskCreate/spawn_task),只喂$WORKROOT/numeric_candidates.json+ 全文 docx,不给撰写过程上下文/作者意图(防继承作者确认偏误,否则漏看的真矛盾第 3 层永远看不到→系统性假阴)。子代理产出零容差二元 schema[{"metric","same_measurement":bool,"values":[{"id","raw","location":{"region","para_index"}}],"conflict":bool,"evidence_quote","finding"}](无tolerance_state、无severity):先判是否同一指标/对象/分组/时间点/单位(跨措辞语义归一、跨单位如 μM vs nM 由 LLM 换算判;中文线索照吃),仅对同一测量判是否完全相等,same_measurement==true && 非完全相等 → conflict=true;不同剂量组/时间点/亚组/单位的正常差异不报。样本量 n 跨位置核对:核对同一实验/同一组的样本重复数 n(metric_clue=="样本量")是否跨方法学 / 图注 / 结果与讨论三处一致;防假阳:不同图/不同实验的 n 本可合理不同,只有多处 n 明确指向同一实验、同一组样本时其不一致才报 conflict,无法确认的按same_measurement=false不报(拿不准交人工)。降级:派不出真正独立子代理时不得自问自答冒充,标注"数值一致性未经独立检测"交用户人肉核。③ 第 3 层反向验证:每条
conflict==true过delegate_review.py(不改它,只 pack/verify,gate=numeric-verify,checklist 内自由 key,不查 gate_registry)。动态合成$WORKROOT/numeric_verify_checklist.json:item 只放两处raw/location/metric+ 核验所需原文切片(绝不放子代理 finding/reasoning),默认硬项(不标"severity":"soft");≥3 值的组拆成两两配对的多个 item(idnum-<组>-<配对序>,任一配对 pass → 该组整体保留、全部 fail → 剔除)。🔴 check 逐字用零容差极性模板(禁占位符、禁自由发挥):"到给你的原稿全文里独立核实:
{locA}处的值『{valA}』与{locB}处的值『{valB}』,两者据称都是指标『{metric}』的测量结果。请逐字回源确认两点——(1) 两处是否确指同一指标、同一测量对象、同一分组、同一时间点、同一单位(即本就应当相等;跨单位如 μM vs nM,请换算到同一单位后再判是否本应相等)?请到原文找出各自邻近的分组/剂量/时间点/亚组/单位线索比对。(2) 若确为同一测量,两值是否非完全相等(零容差:只要不是完全相同的数值即算不等,含末位舍入差异如 58% vs 58.3%)?只有『同一测量且非完全相等』才判 pass(矛盾属实,保留交人工裁决);只要发现两者其实是不同分组/不同时间点/不同亚组/不同单位(正常差异),或换算后完全相等,一律判 fail(非矛盾,剔除)。 evidence 必填:逐字引出 A、B 两处原文句及各自的分组/时间点/单位线索。"--files给全文 docx;pack→ 独立空白子代理逐条裁pass|fail|na附逐字证据 →verify。verdict 映射:pass→confirmed(矛盾属实);fail/na→refuted(剔除);verify 的problems(空证据/未裁决/verdict 非法)照 fail-closed 视为未核验、不进清单(宁漏报)。极性写反 = 假批评全放行,务必对准 pass=矛盾属实。 ⚠️ 退出码陷阱(务必理解):本 numeric-verify 复用通用门禁delegate_review,任一 item fail 会让 verify 报ok=false/ exit 1 / stderr『盲检未通过』——但在数值反向验证里 fail = 成功剔除假矛盾 = 正常好结果。主 agent 必须忽略退出码,只读返回 JSON 的逐条 verdict + problems:verdict=pass→confirmed 保留、fail/na→refuted 剔除、problems 内→fail-closed 不进报告。切勿把 exit 1 误读成核查失败 / 报告不能完成。stderr 文案同样极性反转:『盲检未通过(fail-closed):不得向用户声明本节/本报告完成』是通用文案,在 numeric-verify 里恰恰打印在最好的结果上(全部 fail = 假矛盾全被剔除),不得照抄转达用户、不得据此判数值门未完成。④ HALT:命中 confirmed conflict → HALT 交用户裁决(列
metric+ 两处raw/location + evidence_quote),暂停本步、用户逐条裁决是否需统一,处置后重跑至无 confirmed conflict 再放行导出。数值门为 HALT 交人工,与参考文献硬门并列,不 auto-block 硬拦、不静默判等放过。
方法学漏写核查(M,三层·章级 scoping + 章范围门·与数值门并列·HALT 交用户裁决):"结果做了某实验、该章方法学没交代"在学位论文里比期刊稿更高发——方法学被拆到各研究章重写,跨章漏写没有任何现役护栏(S1「实验-方法映射」只做
[实验]/[对应实验]符号级闭合,管不住"标记齐了但方法学正文没写这个方法怎么做")。读与数值门同一份03_合并文档/完整博士论文.docx(材料与方法强制三张表 → docx 表格 walk 是头号用例,methods_terms.py已额外遍历doc.tables抽单元格,命中记location.source=="table")。- ① 第 1 层弱锚焦点图:
python scripts/methods_terms.py --manuscript "${save_path}/03_合并文档/完整博士论文.docx" --project-root "$WORKROOT"→ 产$WORKROOT/methods_terms.json(顶层authority:"weak_focus_map"+method_hits命中清单 +methods_sections方法学小节清单(number带章号前缀,如2.2/2.2.1/3.2)+summary;退出码 0=正常含空稿、2=用法/输入/解析错)。落$WORKROOT根,不得落进atomic_md/、02_分章节文档/、03_合并文档*/等托管 glob(否则触发派生稿/signoff 门禁)。弱锚非权威真值——只帮第 2 层聚焦、给第 3 层回源锚点,从不判"漏写"。降级:methods_terms.pyexit 2 或 JSON 缺失/损坏 → 第 2 层降级为纯全文语义跑 + 告警(它本就被要求不依赖弱锚),不得静默跳过。- 🔴 弱锚失效自检(必做·防 M 线静默空转):跑完立刻读
summary.weak_anchor_suspect(脚本已把判据method_hits > 0 且 methods_sections == 0下沉成确定性布尔量,stdout 与methods_terms.json两处都有;主 agent 只读这个字段、别自己算)。true不是正常空结果,是明确的异常信号——全稿有方法词命中、却一个方法学小节都没认出,最常见原因是该稿方法学小节名不在numeric_candidates._REGION_KEYS词表内(词表永远可能漏),后果是region全程停在Body、表格命中退化成零信息、章范围门兜底判据把每章都判"无方法学结构→跳过"、M 整条线空转但 exit 0 + JSON 合法,上面那条降级条款(只认 exit 2/JSON 坏)永远不触发,用户以为 M 跑过了。必须告警、不得当正常:向用户打印「⚠️ 弱锚异常:检出 N 条方法词命中、但识别到 0 个方法学小节,疑似贵稿方法学小节标题写法不在词表内 → 本轮 M 判定不可靠」,并交用户确认(贵稿方法学小节实际叫什么/是否确无方法学结构)后再继续;继续时按"无弱锚"跑第 2 层纯全文语义,章范围门只用主判据chapter_role、禁用methods_sections兜底判据(它此刻恒为空,用了就是全章跳过)。weak_anchor_suspect == false才照常跑、不告警(含method_hits == 0的通篇无方法词稿,那是正常空结果,字段恒为false)。
- 🔴 弱锚失效自检(必做·防 M 线静默空转):跑完立刻读
- ② 第 2 层独立检测子代理(非作者自检·I2):派 fresh context、没参与撰写的独立检测子代理(
TaskCreate/spawn_task),只喂$WORKROOT/methods_terms.json+ 全文 docx,不给撰写过程上下文/作者意图(防继承作者确认偏误,否则漏看的真漏写第 3 层永远看不到→系统性假阴)。判每个本研究做的实验方法在其所属章的方法学里有没有交代,报methods_missing。产出 schema[{"chapter":N,"method","used_in_study":bool,"methods_section_covers":bool,"methods_missing":bool,"evidence_quote","finding"}](判据used_in_study==true && methods_section_covers==false → methods_missing=true)。下游路由:methods_missing==true进第 3 层;used_in_study==false(引用他人/背景)或methods_section_covers==true丢弃。通用约束(逐条写进 prompt):① 弱锚非穷尽:method_hits只是字面命中参考,必须自行通读结果与讨论、语义识别词典外方法(含隐含表述如"散点图门控"→流式),不得只盯method_hits;② 只判本研究做的(头号假阳防线):绪论/背景/讨论里引用他人研究提及的方法("既往研究采用…")与"将来/拟/计划"的未来工作一律不报(判据 = 人称时态 +region+has_figure_adjacent+ 语义,拿不准交第 3 层兜);③ "交代了"从宽三选一(任一即methods_section_covers=true):该章方法学出现方法名(标题或描述怎么做的句,不要求可复现)/ 主文指向补充材料或附录 / 方法学引用文献描述该方法("方法参照文献[X]"/"as previously described [12]" 带引文标记)。降级:派不出真正独立子代理时不得自问自答冒充,标注"方法学一致性未经独立检测"交用户人肉核。 - ⚠️ ③ 三种低频形态会假阳(2026-07-28 复查实测补记,纯提示不改代码):四级标题
#### 3.1.1.1 缓冲液(本技能自身强制 ≤3 级并把####判 error,故管道内该引用本就是真断链;仅用户手写四级标题时才是假阳)、标题编号后无空格### 3.2.1材料来源(本技能生成的标题带空格,中文作者手写偶尔不带)、~~~围栏(围栏跳过只认```,学位论文用~~~极罕见)。三者均低频,处置同上:整章/全稿集体断链先怀疑格式,别逐条改编号。- 🔴 章级 scoping(防跨章假阴·sci2doc 专属硬约束,必须写进子代理 prompt):判定必须逐章闭合、不得跨章。某方法在第 N 章的 结果与讨论 出现,只有第 N 章自己的 材料与方法交代了它才算
methods_section_covers=true;第 M 章(M≠N)的方法学交代过不算——学位论文每个研究章是一次独立研究、各有完整的材料与方法。不逐章闭合 = 第 2 章方法学声明的方法会把第 4 章的漏写判成"已覆盖",M 在多章博论上系统性假阴、等于白挂。已知缺口(明写):method_hits[]没有 chapter 字段,章归属须子代理自己从四个确定性线索推断——全文里的章标题第N章 …、method_hits[].location.para_index单调序(source=="table"的为null,靠region+ 全文定位)、methods_sections[].number的章号前缀(.前第一段即章号,即"第 N 章方法学写了哪些小节")、region逐章正确翻转(Methods→Results→Methods→…)。这是 prompt 级要求、非脚本保证。 - 🔴 章范围门(防绪论章/末章整章假阳):绪论章综述全部研究、末章跨章综合,两章都没有 材料与方法 结构却大量提到方法名,不设门 → 整章方法词无方法学可对应 → 整章假阳。两判据取或,任一判为
research就跑(宁多跑、第 3 层兜假阳):主判据 = 复用现役确定性章色分类器state_manager.chapter_role(project_root, N)(读project_state.json.outline的章标题:含"绪论"/"引言"→intro;含"结论"/"总结"/"小结"/"展望"→conclusion;其余→research);兜底判据(outline缺失/为空/查不到该章标题时)=methods_terms.json.methods_sections[].number里有无<章号>.前缀条目(有=该章有方法学结构=跑,无=跳)。⚠️ 兜底判据只在弱锚可信时可用:若第 1 层的summary.weak_anchor_suspect == true,methods_sections恒为空 → 兜底判据会把每一章都判成跳过、M 全线空转,此时禁用兜底判据、只认主判据。判跳过的章要向用户打印"第 N 章(绪论/结论)无实验方法学结构,跳过方法学漏写核查"。⚠️ 主判据的"小结"关键词只比对章标题、不比对小节(各研究章末小节都叫"小结",正常不误伤),但「第4章 机制小结与展望」这种章名会被主判据误判conclusion→ 靠兜底判据(该章有4.2 材料与方法)救回,取或即为此。
- 🔴 章级 scoping(防跨章假阴·sci2doc 专属硬约束,必须写进子代理 prompt):判定必须逐章闭合、不得跨章。某方法在第 N 章的 结果与讨论 出现,只有第 N 章自己的 材料与方法交代了它才算
- ③ 第 3 层反向验证:每条
methods_missing==true过delegate_review.py(不改它,只 pack/verify;sci2doc 的delegate_review.py与 reviewer-simulator 逐字节同款 base,无 fork 差异。gate=methods-verify,checklist 内自由 key,不查 gate_registry)。动态合成$WORKROOT/methods_verify_checklist.json:item 只放 章号 +{method}+ 结果处用到该方法的原文命中句(弱锚sentence或第 2 层evidence_quote)+ 核验所需切片(绝不放子代理 finding/reasoning、不放methods_terms.json),name必须带章号让核验人知道要核的是第 N 章的方法学而非全文任何一处方法学,默认硬项(不标 `"severity
- ① 第 1 层弱锚焦点图:
…(truncated)