Health Vault(个人/家庭健康档案归档)
把体检报告、化验单、处方、就医记录的照片/文字,归档进 Obsidian 健康库:检查报告(汇总页 + 单报告页 + 原图)+ 就医记录 + 指标表 + 用药流水。只做整理与引用。
先读 vault 里的 AGENTS.md——它的规矩优先于本技能(用户在仓库里维护的那份是权威口径)。
硬边界(永不违反)
- ❌ 不诊断:不做诊断推理、鉴别诊断、可能性排序、漏诊评估。医生写的是「记录」,没写的不许推断。
- ❌ 不给用药建议:不推荐、不调整、不替换、不停药。
- ❌ 不判断紧急度:出现胸痛、呼吸困难、大出血、意识丧失、自杀念头、突发严重神经症状等描述时,先让用户就医/呼叫急救,再继续归档。
- ❌ 不补造数据:缺失标
[信息缺失];推断的标[推断]并说明依据;数值拿不准标[待核对]并留空。 - ✅ 保留不确定性;结尾提醒:档案是整理,请与医生确认。
- ✅ 备注只写事实与口径,不写“给未来 agent 的提醒”(如“别删它”“故意留着”“此处不可动”)—— 用户明确反对:那是污染。要一句就够的话就只写那一句。
六条交互规矩(用户明确要求)
- 分不清就问:单据类型 / 患者是谁 / 机构日期 / 项目名不在词表 / 是否同一次活动 → 一律先问用户,绝不猜、不编。
- 命名统一走词表:项目名只能取自 vault 里的
8-知识库/项目名规范.md;遇到新项目先问用户,再补进词表(连同别名)。禁止同义异写(心电图 ≠ ECG ≠ 心电检查)。 - 多份单据先问归属(跨天必问住院):一次归档涉及多天 / 多份单据,先问归属再归类,绝不自行合并或拆分。
- 任意跨天 → 问「这几天是不是住院 / 是不是同一次安排」。
- 一批单据的日期落在 7 天以内(含同一天多张)→ 问「这是不是同一次看病开的检查合集」。
- 确认同一次 → 合并为 1 个检查活动目录 + 总表 1 行:目录名与汇总页 frontmatter
日期取其中最早那天的检查日期,结束日期填最晚那天;总表只加一行(两边同名互链);就诊日期与最早检查日不同 → 问用户以哪个为准。 - 各单据自己的日期照抄、不随活动日期改写:单报告页
日期/ 原图文件名 /指标总表.csv的日期都用这张单子自己的日期(统一改写会毁掉「近 N 次血常规」的时间线)。 - 确认不是同一次 → 各成一个活动目录;超过 7 天默认不合并(除非用户说是同一次安排 / 住院)。
- 规矩写在 vault 里,不写进 agent 记忆(记忆会被压缩磨损):约定、词表、口径的变更都改 vault 的
AGENTS.md或8-知识库/。 - 冲突必问:同一件事在两处对不上(既往史与报告不符、日期/剂量两说、同一检查两次描述不同)→ 不自行取舍、不静默覆盖,把两处原文并排列出,问用户「按哪个?改还是不改?」;用户定了再动,且两处都要落到一致(只改一处 = 待核对)。用户说“重复了、以某处为准”时,另一处留链接 + 一句指针,不删原文。
- 不适用于
1-基本信息/—— 那是基准线,见下一条。
- 不适用于
1-基本信息/是基准线:默认只读、不主动问:- 不主动改:除本人主动要求增 / 改 / 删,本页一个字都不动;别处新到的数据不回流到这里。
- 不主动问:新数据与本页不一致(例:体重、既往史年份)→ 不问“改不改 / 按哪个 / 要不要同步”,把新数据照常记到它该去的地方(报告页 / 指标 / 体重管理 / 就医记录)。
- 他主动问起时才并列:把两处并排列出 + 各自出处,不判读、不替他取舍、不追问。
- 理由:数字每次总有细微差别,每次追问“改不改”效率太低 —— 本页是基准线;差异不是冲突,是不同时间的两次记录。
重复来源:手机端 App 截图 vs 纸质报告
同一份报告可能从两条路进来:纸质版(扫描/拍照)和医院 App/公众号的手机截图。先比对再动手:把截图里的异常项和关键数值与已有活动逐项对(异常项组合、关键数值、「阴性」类定性结论能一眼认出来)——对得上就是同一份,问用户确认后不新建活动、不重复进指标表(截图可作补充原图,命名约定由用户定);对不上才按新活动走。
- App 截图的「异常」列照抄:有些医院 App 单据用
H(偏高)/M(仪器正常标记)代替 ↑/↓ → 报告页与总表照抄原标记,并在一处说明「H/M 为该院仪器标记,本档不做判定」;写进指标总表时H→ 「异常」列填H,M→ 留空。App 单据的项目名(白细胞计数(WBC)、血红蛋白量(HGB)、红细胞比积(HCT)、RDW-SD…)要落到词表标准名,写在报告页的「单据」块里。 - App 截图右下角常有「转发截图」浮层:会压住最后 1–2 行的单位与参考范围 → 先放大确认,仍读不全就记
[待核对]并注明「截图上被浮层遮挡」(可附同院同类单据的写法供参考)。 - App 上的「发布时间」= 结果推到手机的时间,不是检查日期(例:某次 11-30 的体检,胸片 12-09 发布、总检 12-29)→ 不能拿来当活动日期。
- 同一份报告两个来源的文字可能不同(纸质版「无 / 阴性」 vs App 版「未检出」)→ 按"冲突必问"交给用户定,不自行取舍。
- 用户说"既然都有了,就不录入了"时就一行都不写(不建活动、不建报告页、不动指标表、不 commit),只在回复里说明已比对过。
单据未载明的后续结果(如「14 天后取报告」)
单据栏位空白、结果要之后才取回的情况(培养 / 细菌鉴定 / 补发报告等):
- 报告页照抄单据:栏位是空白就写空白,参考值栏印什么抄什么——不把后续结果填进单据的栏位里。
- 另一行记后续结果,出处写明「本人述(日期)」;取回日期按单据印的期限推算并标
[推断](如单据印「14 天后取」→ 约 14 天后,本人未记确切日期)。 - 这种情况不新建检查活动:同一张单据的结果返回,不是新一次检查;跨天也不触发「7 天合并」那一条。
- 处方出处也要回填:本人述「医生开的药」若能在后来的单据里找到更早的医嘱日,按冲突必问确认后,把用药流水那一行的「处方出处=某日某机构」补上(实际开始服用日另记),不要改写剂量。
读图:机器印的小字表格(听阈 / 声反射 / 检验细项)
- 列多、字号极小的打印表,直接照抄容易错列。先用可交叉验证的量反推:例纯音听力检查表头的 AC/BC PTA 是 500 / 1k / 2k / 4k 的平均值 → 用它验证数字到底落在哪一列;对得上再照录,对不上就标
[待核对]并留空,别猜。 - 逐格小字(如声导抗声反射阈值的 0.00–0.03 ml)宁可只记「该格有数值 + 数值区间」并指向原图,不把可能读错的具体数字写进档案 —— 错的数字比缺的数字更糟。
- 单据上手写批注(耳鸣频率 / 响度、医生补充)逐字回读给用户确认后再落笔,并在报告页注明「本人 <日期> 确认」。
边界:只在库内工作(用户明确要求)
- 先看会话的工作目录(cwd):
- cwd 在库根目录(及其子目录)内 → 直接干,不用问。
- cwd 不在库内(外部项目 / 任意目录)→ 先问用户:“要把这个记进病历库吗?” 得到确认后再写。
- 用户确认后,仍然按本技能的完整流程与库内规矩办(不要因为不在库内就简化:9 步流程、受控词表、只增不改、原图复制、commit 一个都不能省)。
- 绝不主动写:只有用户明确要求归档 / 记录时才动笔;闲聊、提问、查资料不写库。
- 库内会话的权威口径是库根
AGENTS.md(优先级高于本技能);库外会话只能依据本技能。
vault 位置
默认 vault:〈库根目录〉。当前成员:张三(成员目录 〈库根目录〉/张三/,归档直接写这个目录下)。结构是库 → 人 → 档案:库根只放 AGENTS.md、README.md、8-知识库/(共享规范与药品索引)、9-模板/;每个成员一个目录(以人名命名),里面才是 1-基本信息/…8-体重管理/(顺号,不跳号;注意成员级 8-体重管理/ 与库根 8-知识库/ 同号但不同层)。新增成员时不要在成员目录里复制 8-知识库/ 与 9-模板/。若 $OBSIDIAN_VAULT_PATH 有值,以它为准。
1-基本信息/ = 基准线(默认只读):除本人主动要求,不改、不主动问、不回流新数据(细则见交互规矩 6)。
电子病历库/ ← 库根(Obsidian 打开这一层):AGENTS.md / 8-知识库/ / 9-模板/
└── 张三/ ← 当前成员(新增成员 = 并列一个同名目录)
├── 1-基本信息/ 姓名、过敏史、慢病、紧急联系人(**用药不在此**,见 6-用药/)
├── 2-检查报告/ YYYY-MM-DD-机构-活动/ ← 一次检查活动一个目录(汇总页 + 报告/ + attachments/)
├── 3-不适记录/ 不适记录.md ← 自述不适的纯记录(没看病也记):日期 / 感受 / 怎么处理 / 持续多久
├── 4-就医记录/ 就医记录总表.md(唯一手写源)+ 年子表 ← 一行一次医疗接触(含 自查);行内含「用药/治疗」快照
├── 5-指标/ 指标总表.csv(跨来源数值长表)
├── 6-用药/ 用药流水.md(顶部「当前在服」表 + 按药分节时间线:长期 / 医嘱 / 自用)
├── 7-视图/ 给医生看的三件套:主档案 / 用药记录 / 化验指标追踪
├── 8-体重管理/ 体重管理总表.csv(**自己测的**体重/体成分长表:一次测量=一组行;**不进 5-指标**、**不留原图**)
└── attachments/ 待归类原图(暂存,不编号)
核心模型:就医记录(上位)↔ 检查报告(下位)
- 就医记录 = 一次医疗接触,表格里的一行:日期、机构/医生、类型、科室、症状/主诉、判断/结论、医嘱、下次复查、检查报告、ID;
类型= 体检/就诊/住院/复查/自查。总表是唯一手写源,年子表由总表派生。含「用药」/「治疗」列(本次开药与处置的快照,与用药流水有意交叉)。 - 检查报告 = 一次检查活动,一个目录:
汇总页.md+报告/<标准名>-YYYY-MM-DD.md+attachments/。 - 一次体检 = 1 行就医记录 + 1 个检查活动目录(两边同名互链;表格行挂不了块 ID,靠
ID列 ↔ 活动页 frontmatter就医ID配对)。 - 同一次看病的多份检查(日期在 7 天内)= 仍是 1 行 + 1 个活动目录:活动日期取最早那天(
结束日期记最晚那天);单报告页 / 原图 / 指标行仍用各自单据的日期。 - 没有报告的就医(打针/输液/口头医嘱)→ 只有总表里那一行。
- 自查(没看医生)→
类型: 自查,「判断」写自主判断:xxx,医嘱与检查报告留空;用药照记到用药流水.md。 - 为什么汇总页与单报告页并存:汇总页给人回看;单报告页给检索聚合(“近 10 次血常规”),且是图像型/描述型报告(心电图、CT、超声、内镜)的唯一载体——它们进不了数值表。
归档流程(9 步)
开工前先
git status:工作区应干净。若某文件近期被其他会话改过(工具会提示 sibling 改动),先read_file读最新内容 +git diff HEAD比对,再用定点patch改;绝不整篇重写别人刚改过的文件 —— 并发会话会把未提交的改动冲掉。
另一条入口:只汇报不适(没看病) → 追加
<成员>/3-不适记录/不适记录.md一行(照原话;只有四列:日期 / 不适的感受 / 我怎么处理的 / 持续多久);若同时自己吃了药 → 按 6b 记用药流水.md。不建检查活动、不加就医记录行。与「自查」的区别:自查 = 自己判断+自己吃药处理了(算一次医疗接触),不适记录 = 只是有感受。
再一条入口:体重管理记录(体脂秤 / 身体成分截图) → 追加
<成员>/8-体重管理/体重管理总表.csv一组行(一次测量 = 一组),只提取文字、不留原图。不建检查活动、不加就医记录、不进指标总表。
- 读图 → 确认 类型 / 机构 / 日期 / 患者 / 项目名(任一项不确定 → 问用户)
- 多天 / 多份单据(日期落在 7 天内)→ 先问归属:是不是住院、是不是同一次安排、是不是同一次看病的检查合集。确认同一次 → 合并为一个检查活动,活动日期(目录名 + 汇总页「日期」)取最早那天,
结束日期填最晚那天;确认不是 → 各成一个活动 - 在
4-就医记录/就医记录总表.md加一行(填ID),并按年重生成该年份子表 - 建或更新检查活动目录(
2-检查报告/):汇总页 +报告/+attachments/ - 复制原图进该活动
attachments/,重命名为YYYY-MM-DD_<标准名>_原图[_pN].ext(上传缓存目录里的图只是临时文件,必须复制)。一张单据含多个检查项目时,项目名用+连接(按单据顺序),如2024-12-02_电解质+肾功_原图.jpg;各报告页共用这一张原图,用任一项目名都能捞到它 - 数值型 → 追加
5-指标/指标总表.csv行;图像型/描述型 → 原图内嵌![[...]]+ 写结论(数值已入表: false) 6b. 用药 → 在6-用药/用药流水.md按药追加/更新(动作 / 剂量 /依据=医嘱或自主 /停止原因/ 来源链接);长期服用的同时更新顶部「当前在服」表;就医记录那一行的「用药/治疗」列写同一份快照(两处交叉、都要写) - 更新
7-视图/:用药记录.md、化验指标追踪.md由上游派生重生成;主档案.md追加更新 - 按
references/validation_rules.md+references/completeness_checklists.md自检,列“待核对” git add -A && git commit -m "归档: <事件>"
单报告页 frontmatter 必填:类型(化验/影像/功能检查/病理) 项目(词表) 日期 机构 患者 检查活动 就医记录 数值已入表。
用药与药品库
- 用药唯一源头 =
6-用药/用药流水.md:1-基本信息/不存任何用药信息(避免两处重复);给医生看的用药视图由它派生到7-视图/用药记录.md。 - 记录位置:
6-用药/用药流水.md—— 按「药」为主线,覆盖 (a) 长期服用/保健品(顶部「当前在服」表)(b) 看病开的药(开了什么 / 实际怎么吃 / 吃多久)(c) 自我用药(含停止原因)。就医记录总表的「用药/治疗」列写本次快照,两处有意交叉、都要写(只更新一处视为待核对)。 - 药名规范:
通用名(剂型),如布洛芬(缓释胶囊);需要时后接大概规格 / 剂量(用户说明才追加,如地芬尼多(片)25mg),不猜。 - 不记频次(一天几次):用户回忆不准,记了只会产生
[信息缺失]噪声 → 不记、不问、也不留空占位;只记 药名 + 大概规格/剂量 + 开始/停/依据/停止原因。用户报商品名(优甲乐/芬必得)→ 查库 → 回问确认 → 落通用名;库中没有的药 → 请用户看药盒,不编。 - 药品库(可选):
〈药品库目录〉/drugs.sqlite(上万条中文说明书 + 上万条相互作用),查询脚本〈药品库目录〉/q.py,建库build.py,用法见drug-lookup技能。绝不把库读进上下文,只查、只引用命中行。⚠️ 公开可得的中文说明书整理集许可不明,仅本机个人参考,不得再分发;授权来源(RxNorm/RxNav、openFDA)见8-知识库/用药指南/索引.md。 - 边界:只照录说明书原文(适应症/禁忌/不良反应/相互作用 + 风险等级),不给用药建议、不做判断。
面向医生的病历报告(PDF)
- 素材 =
7-视图/三件套 + 本次症状(可从3-不适记录抽同类不适的时间线)+ 指标时间对比 - 四段:① 本次不适(症状描述)② 近期用药 ③ 相关化验指标(带时间对比,标上涨/下降)④ 既往要点
- 脱敏:只放 性别 / 年龄段 / 身高体重 / 过敏史 / 慢病 / 用药 / 指标;不放全名(用 ××)、身份证、电话、住址、单位
- 居住信息只写常驻地城市(如「常驻地:某某市」);海拔 / 气候等环境细节留在
1-基本信息/的隐私版 - 实现:HTML + 打印 CSS → 无头浏览器打印为 PDF(
firefox --headless --print-to-pdf之类;本机有 libreoffice / Chromium 也可)
指标总表(5-指标/指标总表.csv)
列固定:日期,患者,来源类型,机构,检查活动,项目,指标名,值,单位,参考范围,异常,来源笔记
- 一张总表:某次就医的数据 → 按
检查活动/来源笔记筛;某指标近 N 次 → 按指标名分组 - 只装数值型;数值照抄(含单位),不换算、不推断,缺失留空
- 定性判定值不进本表(例:幽门螺杆菌呼气试验的 DPM 只是报告的判定值 → HP 阴性/阳性 写在报告页)
- 同一指标在不同单据里单位写法不一致时各抄各的,不换算、不统一(看趋势时自己留意单位)
- 体重 / BMI / 体成分这类自测数据不进本表:身高留在
1-基本信息/;体重、BMI、体脂率等进<成员>/8-体重管理/体重管理总表.csv。本表只装“有检验报告”的临床数值
体重管理(<成员>/8-体重管理/)
放什么:自己测的体态数据(体重 / 体成分)—— 高频、无报告、无参考范围,与“有检验报告的临床数值”分开(曲线才干净)。另有成员级 8-体重管理/ 与库根 8-知识库/ 同号不同层,引用带路径。
文件:<成员>/8-体重管理/体重管理总表.csv —— 唯一数据源,长表:一次测量 = 一组行,一行一个指标。
不留原图:体脂秤/身体成分截图只提取文字,不复制进库、不留备份(复查看表即可,存图没意义)。
列固定:日期,时间,患者,来源类型,项目,机构/设备,指标名,值,单位,参考范围,判定,笔记
来源类型:自测(家用设备)/体检/就诊 —— 「自测」是本目录专有值,不进5-指标的枚举项目:词表标准名(当前体脂秤);指标名取自词表「体重管理指标名」单位/参考范围:设备上印了才写;App 只给定性标签时参考范围留空判定:照抄 App 标签(标准 / 偏高 / 过高 / 偏低),不自己判读、不换算- 同一天多次称重:逐条追加,不合并、不取平均;设备没给的项不写行
- 不建检查活动、不加就医记录、不进
5-指标—— 它不是一次医疗接触
命名规范
- 就医记录页 / 检查活动目录:
YYYY-MM-DD-机构-活动(两边同名,便于互链);合并活动(7 天内的同一次看病)取最早那天的日期 - 单报告页:
<标准名>-YYYY-MM-DD.md;汇总页:同活动名 - 原图:
YYYY-MM-DD_<标准名>_原图[_pN].ext;一张单据含多个检查项目时项目名用+连接(按单据顺序,如2024-12-02_电解质+肾功_原图.jpg),各报告页共用该原图,任一项目名都能捞到 - 一份报告(如体检)跨多页、且一页含多个项目时:每页存一份原图,
_pN记该页在这批检查单据里的页序;同一检查跨页时相邻两页的文件名里都带它的标准名(如血常规_原图_p1+血常规+血糖+肝功+肾功_原图_p2) - 不是检查项目的页(封面、检查项目清单、总检报告):按页名命名
YYYY-MM-DD_<页名>_原图.ext - 同一张照片上既有检查项目、又有门诊病历 / 处方:按检查项目命名(页名不写),在汇总页注明该照片另含门诊病历 / 处方
- 用户可指定排除某些检查项 → 不建单报告页、名字不进原图名、数值不进表;原报告页里若含被排除项,
+连接里不写它 - 标准名一律取自
8-知识库/项目名规范.md
逆向导出(靠命名规则保证)
- 近 10 次心电图原图:
find 2-检查报告 -path "*attachments*" -name "*心电图*" | sort | tail -10 - 近 10 次血常规报告页:
find 2-检查报告 -name "血常规-*.md" | sort | tail -10 - 某部位不适历史(溯源):
grep -n "太阳穴\|头疼" 3-不适记录/不适记录.md - 收齐后可打包 zip 交用户,或生成对照页
读图技巧(旋转 / 长条单据)
- 内容相对照片旋转 90° 的单据(热敏打印条、横向长条、扫描时放倒的报告)先转正再读:
PIL Image.transpose(Image.ROTATE_90 / ROTATE_270)各出一张,用视觉模型各看一角判断哪个方向是正立的,再按块裁剪。 - 视觉识图工具的裁剪参数(如
region)用原图像素坐标,裁剪后再放大时坐标要按比例换算回去;小字(分区数值、表格行)要专门放大到 1.5–2× 才读得准,别在整图缩略图上猜。 - 读不出就不猜:机器分区值、未辨字符(如某些符号被渲染成方块字)→ 原页写「见原图 / 未辨字符」并说明,不编。
- 打印条 / 机器读数的单位以单据自己印的为准:单据没印单位的段落,写「单据未印单位」,不按惯例替它补 D / mm。
- 同一批单据里若有单据姓名栏空白、机构名被遮挡:先问用户,并把「为何判定为本人的」依据(同次另一张单据印的姓名 + 本人确认)写进汇总页。
术语与表述
- 用户口语(「肚子疼」「发烧」)写成标准表述(腹痛、发热):对照
references/terminology_map.md;有歧义先追问。 - 通俗解读(给父母看的版本)严格按
references/plain-language-rules.md:只反映文档内容,不解释、不推断、不排序;给 3–5 个「可以问医生的问题」。
检索与对照
- 程序侧:Obsidian 官方 CLI(
obsidian search query="甲状腺"、obsidian vault;Linux 下需XDG_RUNTIME_DIR=/run/user/<uid>,且要有 Obsidian 进程在跑)。 - 文件侧:直接
search_files/read_file读 vault(更快,纯无头也能用)。 - 历史对话:全库检索历史会话记录(含聊天软件、桌面端来源)。
- 回答健康问题前:先查 vault(结构化事实+趋势),需要原话再回会话库,两边都给出处。
运维注意(Obsidian 侧)
~/.config/obsidian/obsidian.json同时存 vault 注册表和 app 级设置("cli":true就是官方 CLI 开关)。改它必须读-改-写,整体覆盖会静默关掉 CLI 开关与硬件加速设置。- 搬动/重命名 vault:先停掉 Obsidian 进程(或
systemctl --user stop obsidian.service),改完路径再启动,用obsidian vault验证新路径。 - GUI 自动化:
xdotool之类的外部工具比通用键鼠注入更可靠;操作前先windowactivate激活主窗口。
会话怎么用(用户约定)
- 会话只是投递窗口,不是分拣口:用户往哪个会话说都行,agent 按单据类型分发到
2-检查报告/3-不适记录/4-就医记录/5-指标/6-用药。用户不需要为“该放哪个会话”纠结。 - 带照片的会话要短(图片每轮重发,涨得快、最易触发压缩);一批单据一个会话,归档完提示用户开新会话或归档会话。纯文字会话可以很长。
- 归档完成后用户删/归档那个会话都不影响库(数据在磁盘文件里);但删太早会丢掉“当时原话”的对照 → 回复里必须明确说“已归档 + 已 commit”,用户才动手。
- 库只增不改:就医记录/指标/用药/不适记录都只追加行;历史行不动。修正 = 追加 + 标注。
- 唯一例外:
7-视图/三件套是从上游重生成的派生文件(源数据不动,丢了可再生成)。 - 每次归档收尾
git add -A && git commit(本地 git,无远程仓库、不上云),任何提交都能回滚。
参考文件
references/field_schema.md/references/entity-schema.md/references/terminology_map.md/references/validation_rules.md/references/completeness_checklists.md/references/plain-language-rules.mdreferences/medchrono-SKILL.md、references/medchrono_medical_tracker.py— 参考项目的 OCR 流水线9-模板/(库根共享)— 归档模板与视图模板;含检查活动-汇总页模板.md/单报告页模板.md/主档案.md/用药记录.md/化验指标追踪.md/体重管理总表.csv(表头)- vault 内:
AGENTS.md(权威规矩)、8-知识库/项目名规范.md(受控词表)、8-知识库/设计说明.md(为什么这么定)
来源与取舍
吸收:canvas-stardust/medchrono(模板与工作流)、SkillHub「病历分析专家包」(字段规范、术语表、校验规则)、patiently-ai(通俗解读铁律)、medical-entity-extractor(实体结构)。不采用:其中面向医生的「辅助诊断/鉴别诊断/临床评分」与「就医建议/科室推荐/用药指导」。