# Scientific Tool Onboarding

> Use when evaluating, adding, or upgrading ScholarAIO support for a scientific computing tool, especially integration-gate review, official docs ingestion, toolref integration, lightweight skill design, and end-to-end CLI verification.

- Skill: `zimoliao/scientific-tool-onboarding` (Agent Skill)
- Install (CLI): `npx skillmds@latest add zimoliao/scientific-tool-onboarding`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zimoliao/scientific-tool-onboarding/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: zimoliao (https://skillmd.com/u/zimoliao)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/zimoliao/scientific-tool-onboarding

---


# Scientific Tool Onboarding

## Overview

先判断一个科学工具是否值得进入 ScholarAIO；只有通过 2.x integration gate 后，接入目标才是形成这三个层次的闭环，而不是“写一份长教程”：

- `toolref` 能查官方接口和参数
- 对应 `skill` 能指导 agent 何时使用、如何验证
- CLI 在真实使用中足够稳，不只是测试能过

规范参考：

- 公开接入说明统一参照 [docs/guide/toolref-onboarding.md](../../../docs/guide/toolref-onboarding.md)
- 产品边界与准入门统一参照 [docs/design-docs/2.x-public-contract.md](../../../docs/design-docs/2.x-public-contract.md)
- 运行时行为统一参照 `scientific-runtime` skill

## When to Use

适用于：
- 新增一个科学计算工具到 `scholaraio toolref`
- 升级某个工具的官方文档源或版本策略
- 发现现有 scientific skill 过重，需要改成 `toolref-first`

不适用于：
- 只写一篇一次性笔记
- 只修一个小 typo

## Core Workflow

### 0. 先过 2.x integration gate

不要因为用户提到一个项目、它很热门，或官方文档可抓取，就默认把它接入 ScholarAIO。先逐项确认：

- 它解决的是已经出现的核心学术任务，而不是增加一个新的平台类别
- 当前 agent 原生能力与已有 ScholarAIO 路径不能充分完成这个任务
- 没有另一套重叠适配器在做同一件事，并且有明确维护责任
- 依赖、凭据和运行时可以保持可选并与 core install 隔离
- 可以设计固定语料或端到端 smoke 来证明用户任务确实改善
- 缺凭据、断网、上游漂移或服务不可用时，能给出可执行错误或 fallback

任何一项不满足时，优先采用外部 recipe、用户自管工具或 sidecar；不要继续下面的内置接入流程。升级既有工具时也要重新过门，不因历史存在而自动保留。

### 1. 再定“官方真源”

优先级：
- 官方文档站
- 官方源码仓库中的文档目录
- 官方维护的 README / man page / PDF

不要优先用：
- 博客
- 第三方教程
- 论坛帖子

要求：
- 记录文档 URL、版本策略、格式（RST / HTML / man / Markdown / PDF）
- 判断适合 `git` 抓取还是 `manifest` 抓取

经验判断：
- 如果官方文档天然按源码版本演进、结构稳定、页面很多，优先 `git`
- 如果官方文档是独立文档站、页面总数可控、但抓取噪音和网络波动明显，优先 `manifest`
- 不要为了“理论更完整”强行选 `git`；用户在乎的是 agent 能不能顺手查到
- 如果文档站有“总目录页 / 命令索引页 / 手册页目录”，优先把它作为自动发现种子，而不是手写所有子页面

当前项目里的经验：
- `QE / LAMMPS / GROMACS` 更适合 `git + parser`
- `OpenFOAM / Bioinformatics` 更适合 `manifest + curated entry pages`

### 2. 再定“接入粒度”

问自己三个问题：
- 用户会按什么名词来查：求解器、命令、参数、字典、子工具？
- `page_name` 应该怎么命名，未来最稳？
- `program / section / title` 该怎样存，`show/search` 才顺手？

经验规则：
- `page_name` 要服务 CLI 使用体验，不要只服务抓取方便
- 一个大页面如果天然包含很多独立参数，应该拆页
- 如果工具本来就是多子工具工具链，允许一个 top-level tool 下挂多个 `program`
- `program` 要优先贴近用户会说出的名字，而不是内部类名或目录名
- `section` 要反映用户排查问题时的思路，例如 `solver` / `dictionary` / `variant-calling`

从现有工具得到的粒度经验：
- `QE`：程序名 + namelist + 参数名，这样 `show qe pw ecutwfc` 才顺
- `LAMMPS`：命令家族一定要做 alias 聚合，不然 `fix npt` 这种自然输入会漂走
- `GROMACS`：`mdp` 参数页必须尽量保留 options，不然会变成只有变量名的空页
- `OpenFOAM`：不要一上来想抓完整站点，先抓 solver / dictionary / post-processing 关键页
- `Bioinformatics`：要承认它是 toolchain，不是单软件；先解决“路由到哪个子工具”

当目标从“最小可用”升级到“主体尽量全量”时：
- 不要继续人工堆 manifest
- 要升级成“seed pages -> automatic discovery -> snapshot manifest -> fetch/index”
- 对于单页大手册，要优先考虑按 anchor / heading 拆成逻辑页

### 3. 先做最小 manifest / parser，不要一上来追求全量

先做高价值页面：
- 最常用求解器或主程序
- 最关键配置字典或参数页
- 最关键模型页
- 1-2 个典型后处理或分析页

先让 `list/show/search` 真正可用，再扩充覆盖率。

停止条件也要明确：
- 如果高频真实查询已经稳定命中正确页，就不要为了“全站完整”无限扩张
- “生产级”不等于“把官网每一页都搬下来”
- 对 manifest 工具，优先做到“关键入口完整 + 网络失败不回退成残废状态”

如果用户明确要求“主体尽量全量”：
- 先定义主线边界，再自动扩展
- 例如：OpenFOAM 主体文档可以包含 fundamentals / tools 主线，但排除插件、挂件、开发者扩展
- 例如：Bioinformatics 工具链可以扩展官方子命令页、章节页、命令手册锚点，但不要把随机第三方生态也拖进来

### 4. TDD 先测 parser 和鲁棒性边角

最低应有测试：
- 解析器能提取 title / synopsis / content
- 版本或 program 规范化逻辑
- top-level `scholaraio.stores.toolref` 入口在内部重构后仍保持兼容
- manifest 工具的“是否完整”判断
- 失败后残缺目录不会被误判成已完成
- 用户自然说法对应的 alias / query expansion
- 缓存保留和 fallback URL 行为（如果是 manifest 工具）
- 自动发现规则（如果是 discovery-based manifest）
- anchor / heading 切片逻辑（如果是单页大手册拆分）
- `meta.json`、manifest 快照、SQLite 索引和 `toolref list` 展示口径一致

如果没有先看到失败场景，就不知道这个工具接入点真正脆不脆。

如果这次工作包含 `toolref` 内部重构或拆包，必须额外补这类兼容测试：

- `import scholaraio.stores.toolref` 后旧调用路径仍可用
- 顶层兼容 patch 点仍能影响真实行为
- CLI 不需要知道内部模块名变化
- 旧缓存数据库在新 schema / trigger 下不会损坏或重复触发

### 5. 实现 fetch/index/show/search 全链路

最低要求：
- `fetch` 能拉取并落盘
- `list` 能看到版本和页数
- `show` 能按用户自然输入命中
- `search` 能搜到高价值页面

重点防御：
- 网络失败后的残缺目录
- manifest 页面部分失败
- program 名规范化不一致
- 页面命名和用户输入不一致
- 同一概念的不同人话表达
- 主入口页失效后没有降级路径
- 包拆分后顶层兼容 facade 失效
- `fetch`、`index`、`list` 的计数口径漂移

manifest 工具的额外要求：
- 对高价值但不稳定的页面，允许配置 `fallback_urls`
- `force refresh` 不能把旧缓存中仍然可用的页面冲掉
- `meta.json` 要能说清楚：预期页数、失败页数、恢复自缓存的页数
- 自动发现得到的 manifest 必须落盘成快照，不能每次都重新“猜”一遍
- 发现阶段已经拿到的 HTML，正式抓取时应直接复用，避免二次下载
- 当外站超时但本地已有种子页缓存时，应该允许“用缓存继续做结构发现”
- 如果逻辑页来自单页手册的 anchor，正式抓取时要允许 `#anchor` 页面复用其基础 URL 的种子 HTML
- 预置高价值页名不一定等于真实 heading id；发现阶段要把真实 anchor 元数据回填到这些规范化 `page_name`
- `toolref list` 不能盲信过期 `meta.json`；必要时要与快照和实际索引自校准
- `fetch` 返回的索引数量要和最终库里的真实可查询条目数一致，而不是解析中间态数量

### 6. 必须做“真实使用体验”验证

不能只跑测试。必须像用户一样手动执行：

```bash
scholaraio toolref fetch <tool>
scholaraio toolref list <tool>
scholaraio toolref show <tool> <natural query>
scholaraio toolref search <tool> "<real query>"
```

检查：
- `show` 命中的是不是用户想看的页面
- 正文前是不是被导航噪音淹没
- `synopsis` 有没有信息量
- 首次失败后，第二次 `fetch` 是否会卡在脏目录
- 搜索是不是只“有结果”，还是首条结果就是对的
- 结果标题是不是能让用户一眼知道为什么它是对的
- 如果是工具链型工具，用户的描述能不能先路由到对的 `program`
- `fetch` 报的页数/条目数，和 `list` 看到的最终数值是否一致
- manifest 工具在旧缓存存在时，`list` 会不会出现自相矛盾的显示
- 对外入口是否仍然只需要 `scholaraio toolref ...`，而不是内部模块命令

如果手感不好，就继续打磨 CLI；不要因为测试是绿的就停。

至少要抽查这三类真实查询：
- 参数名式：如 `ecutwfc`
- 自然语言式：如 `drag coefficient`、`v-rescale thermostat`
- 任务导向式：如 `read mapping nanopore`、`variant calling vcf`

如果做了“主体尽量全量”的扩展，还要加两类检查：
- 扩展后的总页数是否显著增加，而不是只换了实现没换覆盖面
- 扩展后 `show/search` 的核心路径是否仍然稳定，没有被噪音页挤掉

### 7. 再把对应 skill 改成轻量 `toolref-first`

对应 scientific `SKILL.md` 应只保留：
- 何时使用
- 高层工作流
- 科学规范
- `toolref` 查询入口
- agent 行为准则
- 覆盖缺口时如何退化处理

不要把 skill 写成第二份 API 手册。

分工应始终是：
- `skill = 路由 + 方法论 + 验证规范`
- `toolref = 官方接口与参数`
- `scientific-runtime = 运行时退化与用户体验协议`

不要把内部包结构泄漏到 skill：

- skill 和用户文档应该引用 `scholaraio toolref ...`
- 如果确实需要提 Python API，引用顶层 `scholaraio.stores.toolref`
- 不要把 `fetch.py` / `manifest.py` / `storage.py` 之类内部模块写成公开入口

### 8. 最后做发布门槛检查

一个新工具只有同时满足下面几条，才算真正接入完成：
- 官方文档已入 `toolref`
- `fetch/list/show/search` 都能真实使用
- 至少有基础 parser 测试
- 对应 skill 已改成轻量 `toolref-first`
- 至少手动体验过一次端到端 CLI
- 如果做过内部重构，顶层兼容入口也已验证

如果你要判断“是否已经够生产，不要再打磨了”，就看这几条：
- 高频 `show` 查询能直接命中
- 高频 `search` 查询 rank 1 基本正确
- 本地重抓后不会把覆盖率越抓越差
- agent 不需要再让用户帮它维护文档
- 即使覆盖有缺口，runtime fallback 也能继续完成任务
- `fetch/list` 的统计口径不会把用户带沟里

满足这些，就应该把精力转回 demo 和真实科研任务，而不是继续无止境磨 `toolref`

## Common Mistakes

- 没过 integration gate 就因为热度或用户随口提及而新增内置支持
- 把 agent 已有的原生能力在 ScholarAIO 里重复实现一遍
- 让可选集成进入 core install，或在不可用时拖垮核心工作流
- 只看测试，不自己用 CLI
- 第一次抓取失败后没处理脏目录
- `page_name` 为抓取方便而设计，导致 `show` 很难用
- 内部拆包后忘了保护 `scholaraio.stores.toolref` 顶层兼容面
- 把 scientific skill 写成超长命令手册
- 新 skill 没有写清楚覆盖缺口时 agent 应如何继续服务用户
- 用第三方教程代替官方文档
- 把“能跑起来”误当成“生产级”
- 把“manifest 页数 100%”误当成“用户体验 100%”
- 忘记给易失联页面准备 fallback
- 工具链型工具没有先做路由，直接把所有子工具混在一起搜
- `fetch`、数据库真实条目数、和 `list` 展示数字彼此不一致

## What The Current Five Tools Taught Us

### QE

- 机器可解析的结构化文档价值极高
- `program + section + variable` 粒度一旦对了，`show` 体验会非常稳

### LAMMPS

- alias 是生产级体验的核心，不是装饰
- 用户说 `fix npt`，`show` 必须能稳稳落到 `fix_nh`，`search` 至少要把 `fix_nh` 放进最前排结果

### GROMACS

- 参数页不能只有变量名，必须保住 options 和代表性说明
- 排名正确不够，页面内容也要足够回答问题

### OpenFOAM

- 不要妄图第一次就镜像整站
- 先抓高价值入口页，配合好的 search alias，就能把体验快速拉起来
- 自动发现不应该把 curated 高价值入口覆盖掉；应该是扩充或升级它们
- 当用户真的要求“主体尽量全量”时，正确升级路径是：
  - 从官方主线文档页自动发现
  - 只保留主体路径
  - 把发现结果快照化
  - 用快照驱动后续抓取和页数判断

### Bioinformatics

- 首先要解决“这是哪一个子工具的问题”
- manifest 工具一旦跨多个站点，fallback 和缓存保留机制就不是可选项
- 单页大手册常常比“单独 man page 仓库”更有结构价值
- 对 `samtools / bcftools / iqtree` 这类工具，应该利用官方总目录页、命令索引、章节 anchor 自动扩页
- 网络不稳时，已有缓存不只是兜底数据，也应该成为 discovery 的输入
- 高价值规范名和真实 anchor id 可能不一致，例如用户会更自然地说 `ultrafast-bootstrap`，但上游文档的实际锚点可能是 `ultrafast-bootstrap-parameters`

## Production-Ready Mindset

面向 ScholarAIO 用户时，要始终记住：

- 用户不是来帮我们修 `toolref` 的
- 新工具接入的目标是让 agent 更自主，而不是把复杂性重新转嫁给用户
- 最终标准不是“代码优雅”或“页数很多”，而是 agent 是否真的更顺手、更可靠地完成科学任务
- 但如果用户明确要求更完整覆盖，就应该把“自动发现 + 快照 + 缓存复用 + 锚点拆页”做成正式能力，而不是继续靠人工列清单

## Quick Checklist

- 已逐项通过 2.x integration gate
- 已确认没有 agent 原生能力或现有适配器能够充分替代
- 依赖与凭据保持可选、隔离，失败时有 actionable fallback
- 官方文档源已确认
- 版本策略已确认
- 解析粒度已确认
- parser 测试已写
- 顶层兼容入口已验证
- `fetch/list/show/search` 已手动体验
- 残缺目录问题已验证
- 高价值自然语言查询已验证
- `fetch`/`list` 计数口径已核对
- 如果有网络脆弱页面，fallback 已验证
- 如果是 discovery 型 manifest，快照写入与复用已验证
- 如果是单页大手册拆分，anchor 页面 `show/search` 已验证
- 对应 skill 已改成轻量结构
- 新 skill 与 `scientific-runtime` 协议兼容
- 最终再跑一次相关测试与 CLI smoke

