package-new
> 改名说明(2026-10-08):本 skill 原名为「病种注入器」,因上架 SkillHub 需 name 为 ASCII 短横线格式,改为 package-new(展示名同步改为 package-new)。
> 正文与 references 中出现的「病种注入器」均为改名前的历史称谓,指同一 skill;本机技能目录名仍为 病种注入器(未改,以免打断既有路径引用)。
把服务包注入指定病种,产出该病种专属版本。
两条分支(先判分支,再谈其他)
| 分支 | 源包类型 | 主流程 | 逐页依据 | 产物 |
|---|---|---|---|---|
| A | 通用型全病程服务包:B ×14 + D ×21 + F ×11 = 46 页(不含 A01),页面用占位符(XX医院 / XX科 / 疾病名称 / 医生A / 术式A) |
原 Step 0–7 |
规范A-病种注入执行清单-V2.md(A01 段已作废) + 模板基线-通用型46页.md(差异盘点用) |
目标病种包(页数以源包实际文件为准)+ 按需产出的 产品功能清单/ 文档 +《更新说明》 |
| B | 病种专属成品包:页面写实了某个具体病种的全套语义(术式 / 药名 / 解剖部位 / 术后期口径 / 专属页面 / 专属资产群) | Step B0–B4 前置 + 原 Step 1–7 |
规范C-源包解绑规范.md |
目标病种包(保留源包原有页数与结构,不产出通用型中间包)+ 按需产出的 产品功能清单/ 文档 +《更新说明》 |
分支判定在 Step 0 的入口闸门强制完成,不得跳过。
> ⚠️ 交付必须是"一套完整版本"(2026-10-08 用户硬要求;★ 2026-10-10 按用户裁定收窄):页面本体 + 本次应产出的产品功能清单 md +《更新说明》,三者同批交付。
> 文档只在两种情况下产出:① 新增页面(必写)② 结构级大改页(分区增删 / 骨架顺序变化 → 整篇重写)。其余一律不产出、不做基线复制平移、删除页不用声明、首次无基线不生成。规则见 规范D。
> 交付后用户若又改了 / 又加了页面,同一套操作再执行一遍(见「交付后再变更 · 增量同步」)。规则见 规范D。
> ⚠️ 两条分支的逐页依据互不通用:规范A 的 471 项绑死在通用型 46 页编号体系上,分支 B 完全不适用;分支 B 的逐页清单由 Step B3 现场扫出的残留矩阵承担。
> ⚠️ 源包类型判错 = 后面全错。若把专属包当成通用型跑,skill 只能做全局字符串替换,必然留下整包的前序病种语义残留(60+ 页量级)。这正是本 skill v3.0 立分支的直接原因。
适用范围(2026-10-07 用户裁定)
| 项 | 规定 |
|---|---|
| 只处理静态包 | 本 skill 只跑非接口包(纯静态 HTML 演示 / 交付包)。已接入 MDH 接口的包不在本 skill 范围内,遇到即停下声明不适用,不得按静态包硬跑 |
| 不含 A01 | A01(原型入口页)已由用户删除。通用型包 = 46 页(B ×14 + D ×21 + F ×11)。全流程不再有 A01 的注入项与核验项 |
包构成(分支 A)
B 患者端 ×14 + D 中心医护端 ×21 + F 管理端 ×11 + assets/(图表库 + Font Awesome 6.4.0 的 CSS,字体二进制由首次运行下载)= 46 页
> ⚠️ A01 已删除(2026-10-07 用户确认)。历史规范(规范A / 规范B)中所有 A01 条目同步作废。
> 若源包内出现 A01* 文件 → 停下问用户,不得自行处置。
内置标准模板(assets/templates/)
| 项 | 内容 |
|---|---|
| 路径 | assets/templates/通用型全病程服务包-V3.3/ |
| 内容 | 46 页 HTML + assets/js/(echarts / chart / xlsx / timeshift)+ assets/font-awesome/all.min.css;共 54 个文件(字体二进制不在包内,见下方 T0-b) |
| 性质 | 只读基线——任何时候都不得就地修改模板本体;一次注入 = 一次复制,产物落在用户指定目录 |
| 适用分支 | 仅分支 A(通用型)。分支 B 的源包是病种专属成品包,本模板不适用 |
| 逐页清单 | references/模板基线-通用型46页.md(46 页 + 字节数 + SHA256 前 16 位) |
> ⚠️ 包内不含字体二进制(2026-10-08 起):SkillHub 上架不允许提交字体文件(提交时因 fa-*.woff2/.ttf 被拒)。
> 因此包内只保留 all.min.css(纯文本),4 个字体文件(3 woff2 必装 + 1 woff2 可选)由首次运行时下载 —— 见 铁律 T0-b。
> ⚠️ 字体缺失的后果(实测):走本地字体的页面(<link href="assets/font-awesome/all.min.css">)图标静默消失 —— 页面不报错、控制台之外无提示,字形退化成空白占位。走 CDN 的页面不受影响(但那 31 页本身就是既有欠账,见 7.1 A6 的 CDN 组)。
两种用法
| 用法 | 何时 | 怎么做 |
|---|---|---|
| ① 基线参照 | 用户在 Step 0 提供了源包 | Step 6.1 差异盘点:diff -rq <模板> <用户源包>,判定源包是否有未预期的既有改动 |
| ② 默认注入源包 | 用户未提供源包 | cp -R <模板> <输出目录>/<目标包名>,再走 Step 0 → Step 1–7 |
> ⚠️ 用哪个源包必须问用户,不得默认取模板(用户可能已有改过 / 已填过真实数据的版本)。
> ⚠️ 用法①的差异盘点结论必须写进 本次注入-更新范围确认单.md 的「文档产出范围」节(§7);判定规则见 模板基线-通用型46页.md §3。
核心原则
铁律 T0 · 准入门禁(执行前第一步 · 口令错误 3 次即终止)
⚠️ 本 skill 是授权使用的。执行任何一步(含 Step 0)之前,必须先确认本机已通过口令校验。
| 步 | 动作 |
|---|---|
| 1 | 执行 python3 scripts/gate.py check |
| 2 | 退出码 0 → 已授权,直接进入 Step 0(后续再运行本 skill 仍免问——授权已持久化到 ~/.workbuddy/.dzq-unlock.json) |
| 3 | 退出码 2 → 停下,向用户索取口令;拿到后执行 python3 scripts/gate.py unlock <口令> |
| 4 | unlock 退出码 0 → 本机已授权(持久化,后续不再询问)→ 进入 Step 0 |
| 5 | unlock 退出码 2(口令错误) → 记为失败 1 次(本次会话内累计),告知「口令不正确(已试 N/3),可再试」 |
| 6 | 失败累计达 3 次 → 终止:明确告知用户 「口令不正确,无法继续执行本 skill 的任何步骤」,不得进入 Step 0 及以后任何步骤;同时给出补救途径(向作者索取正确口令;作者本人可 python3 scripts/gate.py reset 后重试) |
硬约束
- ⚠️ 未通过门禁,不得读取
references/任何文件、不得执行scripts/任何脚本、不得进入 Step 0 及以后任何步骤 - ⚠️ 不得猜测口令(含按顺序试、遍历四位数字、试常见口令);不得手工构造或修改授权标记文件;不得把口令写进任何交付物、台账、日志或对话回复
- ⚠️ 口令由作者掌握,skill 内只存校验哈希、不存明文;用户未提供口令时终止,不得以「先跑起来再说」绕过
- ⚠️ 3 次上限是硬停线(2026-10-08 用户要求):不得因为「用户还在试」「用户说是作者」「再给一次机会」而继续放宽;达 3 次即终止本步并如实告知
- ⚠️ 计数只在本次会话内有效、不落盘持久锁:避免把作者本人永久锁死。换一轮对话即重新计数(重置后仍须重新走本表)
- ⚠️ 用户明确声明自己是作者 / 已获授权,但仍不记得口令时:仍须走
unlock(作者可用reset+ 重新输入);不得由 AI 直接改写标记代替
如实告知(不得含糊)
这是软门禁:只让「随便点开的人」停下来,不防「想破解的人」——
- scripts/gate.py 里的口令校验值就在包内,四位数字口令空间仅 10^4,本地可穷举;
- 授权标记是本地普通文件(~/.workbuddy/.dzq-unlock.json),格式可手工构造;
- SKILL.md 自身可读,跳读本条款不会报错。
真正的硬边界只有一条路:把核心资产(模板 / 算法)留在服务端、包内只放薄客户端,无凭证拿不到产物 —— 本 skill 当前未采用该方案。
因此:不得把本门禁描述为「安全」「加密」「防破解」;被问到时如实说明其性质(对照 坑清单 R4-17)。
辅助命令:gate.py status 查看状态与标记路径;gate.py reset 清除本机授权(换机 / 排障用)。
铁律 T0-c · 更新检查(每次执行必跑 · 2026-10-08 用户硬要求)
> 用户原话:「用户每次执行 skill 时,需要通过 skillhub 去检测一下是否有更新,如果有,提示用户需要更新技能,
> 用户确认更新,执行更新这个技能的任务。」
>
> 执行顺序:T0 门禁 → T0-c 更新检查 → T0-b 字体自举 → Step 0。
> 放在字体自举之前 —— 若本轮真的要升级,先升级再补字体,否则旧包的字体白下载一次。
| 步 | 动作 |
|---|---|
| 1 | 执行 python3 scripts/check_update.py(可加 --dir <skills 根>;默认读 ~/.workbuddy/skills) |
| 2 | 退出码 0(已最新) → 继续。⚠️ 若输出含「本地版本高于平台」警告 → 按「已最新」处理,但必须把警告原样告知用户,并不得执行任何覆盖 |
| 3 | 退出码 2(检测失败:离线 / 接口异常) → 不阻断:如实告知「本次未能检测到更新」,继续下一步;不得因检测失败就停摆 |
| 4 | 退出码 3(有更新) → 停下提示用户:本地 X → 平台 Y +平台的 changelog;明确问「是否现在更新?」 |
| 5 | 用户不同意 → 记录「用户选择暂不更新」进台账,继续本流程(不得反复追问) |
| 6 | 用户同意 → 按下面「更新执行四步」执行;成功后停下,建议用户重开一轮对话(本轮上下文里加载的是旧版规则,新旧规则混用会出错) |
更新执行四步(同意后按序,缺一不可)
| # | 动作 |
|---|---|
| ① 备份 | 整目录备份 skill 到 ~/.workbuddy/skills_backup_YYYYMMDD_HHMM_<slug>/,确认备份数得清文件再往下(--force 会 rmtree 目标目录,无备份即不可回退) |
| ② 覆盖 | skillhub install <slug> --namespace <ns> --dir <skills 根> --force(新版 zip 由平台下发) |
| ③ 复核 | 读新版 SKILL.md frontmatter 的 version 是否 = 平台版本;gate.py check、fetch_fonts.py check 各跑一次;文件清单无异常 |
| ④ 收口 | 台账记一行「已升级 X → Y」;停下,提示用户重开一轮对话(新规则从新一轮生效);③ 不过 → 用 ① 的备份整目录回滚,并把失败原因如实告知 |
辅助命令与事实说明
python3 scripts/check_update.py # 常规检测
python3 scripts/check_update.py --json # 机器可读(主流程解析用)
python3 scripts/check_update.py --selftest # 版本比较自测
- 为什么不用
skillhub upgrade --check-only作为主路径:它要求包内config.json含update_url,
且该 URL 必须返回 CLI 认的 manifest 形状(version+zip_url/download_url)。本 skill 无config.json,
实测直接skip: config.json not found;平台技能详情接口返回的是latestVersion.version,不是 CLI 认的形状。
故主路径走check_update.py(直查平台接口),同时在包内存在合法config.json时并行跑一次官方命令交叉印证(见脚本--json输出的official字段)。 --force是破坏性的:它rmtree目标目录后解压,本地未上架的改动会全部丢失。
硬约束
- ⚠️ 每次执行 skill 都要检测一次(含增量同步、排障、只跑某一步的场合;检测本身不是打包,也不构成升版许可 —— 见 T0-d);不得以「刚才查过」「应该是新的」为由跳过
- ⚠️ 未经用户确认,不得执行更新;未完成整目录备份,不得执行
install --force - ⚠️ 「本地高于平台」时只提示、不覆盖 —— 这种情况通常是本地有未上架的改动(例:本轮改动尚未发布时,本地 1.1.0 > 平台 1.0.1)
- ⚠️ 版本号由用户指定,不得自行累加(★ 2026-10-10 用户裁定)——
SKILL.md的version唯一基线是平台实测版本(check_update.py输出的「平台 X.Y.Z」);本地 frontmatter 只是「下次要提交的号」,不是「已存在的版本」。
真相:2026-10-10 本地记到1.0.8,而平台实际是1.0.4—— 中间 4 个号从未上架,却被坑清单与规范当成既成事实引用。
升版前先跑一次check_update.py对账;升不升、升到几,由用户定(坑清单 R1-34)。
⚠️ 打包与版本号的禁止自主动作另立一条铁律:见 T0-d。 - ⚠️ 更新成功后不得继续闷头干活:必须停下并建议重开一轮,避免旧规则继续驱动新版本
- ⚠️ 检测失败不得阻断也不能谎报「已是最新」——如实说「本次未能检测到更新」
铁律 T0-b · 首次运行资源自举(字体)
> 本 skill 的包内不含字体二进制 —— SkillHub 上架不允许提交字体文件(2026-10-08 提交时因 fa-*.woff2 / fa-*.ttf 被拒)。
> 包内只保留 assets/font-awesome/all.min.css(纯文本 CSS);4 个字体文件由首次运行时下载(3 必装 + 1 可选,逐文件 sha256 钉死)。
| 步 | 动作 |
|---|---|
| 1 | 执行 python3 scripts/fetch_fonts.py check |
| 2 | 退出码 0 → 字体齐备,继续 |
| 3 | 退出码 2 → 执行 python3 scripts/fetch_fonts.py fetch(幂等;下载后逐文件 sha256 校验;失败自动重试 3 次) |
| 4 | 仍失败(离线 / 被墙)→ 停下告知用户,把脚本打印的手动兜底 URL 交给用户;不得跳过、不得糊过去 |
硬约束
- ⚠️ 字体没补齐,不得进入 Step 0:字体缺失时页面不报错,但走本地字体的页面图标会静默消失(
@font-face加载失败 → 字形退化为空白占位,实测document.fonts.check()返回 false、图标宽度由 36px 掉回 32px 空框)。而verify_pkg.py/review_pkg.py都不检查字体文件 —— 不主动check就发现不了 - ⚠️ 不得用 CDN 顶替:页面必须走本地
assets/font-awesome/(规范B 明文禁止 CDN 图标库;review_pkg.pyA6 组仍在判 FAIL 的「31 页仍走 CDN 图标库」就是这条欠账)。fetch是把文件补到本地,不是把页面改成 CDN 引用 - ⚠️ 不得把字体二进制加回包内:重新打包上架前必须
strip - ⚠️ 交付给用户的服务包应带字体:
cp -R <模板>时字体已在本地 → 产物自带,这是正常的(上架限制只针对本 skill 的上架提交包,不针对你交付给客户的服务包)。但若你的交付通道也有同类限制,需另行处理并告知用户
两态切换(工作态 ↔ 上架态)
python3 scripts/fetch_fonts.py strip # 上架态:删除字体二进制(提交前必做)
python3 scripts/fetch_fonts.py fetch # 工作态:复原字体(提审后立刻执行,否则页面图标全废)
铁律 T0-d · 打包与版本号 · 禁止自主动作(★ 2026-10-11 用户立规)
> 用户原话:「在我没有告诉你打包封版的情况下,不要打包,不要自行定义版本号。」
| 项 | 规定 |
|---|---|
| 打包 | 未获用户明确指示前,一律不得打包 —— 覆盖 ① 交付给用户的服务包 zip;② 上架 SkillHub 的提交包(skillhub publish / 上传 zip / 生成提交目录)。「改完了」≠「可以打包了」;只有用户说出「打包 / 封版 / 提交 / 上架」之类明确指示时才执行 |
| 版本号 | 不得自行定义、不得自行累加。SKILL.md frontmatter 的 version(及包内任何版本号字面量 / README 版本行)只在用户明确给出数字时才改;用户未给出时保持原值不动,交付小结里提请用户定版(「本次改动已完成,请指定版本号」),不得写「已升到 X.Y.Z」 |
| 覆盖范围 | 本条款覆盖 package-new 与 病种注入-接口版 两个 skill,以及任何交付物(服务包 zip、上架包、变更说明的版本行…) |
硬约束
- ⚠️ 不得以「顺手」为由打包:改完规则 / 改完模板 / 跑完校验,都不构成打包理由
- ⚠️ 不得以「版本号该升了」为由改
version:check_update.py输出的平台版本只是对账基线(R1-34),不是升版许可 - ⚠️ 不打包如何交付:原地交付(给出文件路径 + 改动小结);用户要 zip 时会明说
- ⚠️ T0-c 的检测与升级链照常保留(2026-10-11 用户确认)—— 「检测 → 提示 → 用户同意 → 整目录备份 →
install --force」不受本条款影响;被禁的是 AI 主动发起的打包与升版
铁律 T1 · 非明确不改
病种需求未对该页面的展示逻辑作出明确调整时:
- ❌ 不得修改模板的布局与排版格式(网格列数、分区顺序、间距体系、对齐方式、卡片结构)
- ❌ 不得增加任何未明确的元素(图标、字段、按钮、区块、标签、文案、颜色、层级)
- ❌ 不得删除 / 合并 / 重排既有元素,即使看起来冗余
- ❌ 不得做"既然改到这里就顺便…"的顺带优化
只改需求字面明确指向的那一处。需求没提到 = 不动。要补位 → 先问;不确定 → 先问。
T1-b · 分支 B 例外条款(2026-10-03 用户裁定)
当且仅当走「分支 B」(源包 = 病种专属成品包)时,T1 的判定基准如下调整:
| 项 | 规定 |
|---|---|
| 什么算"需求明确指向" | 「清除前序病种语义」本身就是需求——用户要的是"把这个病的包改成另一个病",那么清掉前序病种的标题 / 模块名 / 演示数据 / UI 文案 / 文件头注释 / 时间轴口径 / 字典键 / 专属资产群,每一处改动都能对应到这句话,不算越界 |
| 仍然禁止(不变) | ① 不得改布局与排版格式(网格列数 / 分区顺序 / 间距体系 / 对齐方式 / 卡片结构);② 不得新增或删除需求未提及的元素(图标 / 字段 / 按钮 / 区块 / 标签 / 颜色 / 层级);③ 不得做"既然改到这里就顺便…"的顺带优化;④ 不得重排既有元素 |
| 需单独授权的边界 | 涉及代码注释、数据字典键、CSS 类名 / DOM id、后端标识(model_version / model_code) 的改动,逐条单列并单独提请用户确认,不得随解绑一并改掉(见 规范C §9) |
| 留痕要求 | 例外范围内的全部改动必须逐条登记进 本次注入-更新范围确认单.md,供用户复核;未登记的改动按越界处理 |
> 该例外只对分支 B 生效。分支 A 一律回到 T1 原文(非明确不改)。
铁律 T2 · 不读记忆、不写记忆
| 项 | 规定 |
|---|---|
| 输入来源(仅此三项 + 一项例外) | ① 本 skill 的 SKILL.md 与 references;② 服务包页面源码;③ 当次对话中的需求与参数<br>例外(唯一):T0 门禁的授权状态(由 scripts/gate.py 读写 ~/.workbuddy/.dzq-unlock.json)—— 该文件只含授权状态,不含任何业务信息,且不属于"记忆";除它之外不得读写任何 skill 之外的持久化文件 |
| 禁止读取 | 项目记忆、云端用户档案、历史对话检索、其他项目经验 —— 不得据此"脑补"需求 |
| 禁止写入 | 任何记忆:workspace 日志、MEMORY.md、跨项目记忆 |
理由:病种页面必须由当次需求驱动,避免历史偏好污染输出;保证同一需求多次生成结果一致。
T3 · 交付物 ≠ 记忆
T2 禁止写记忆,但必须产出交付文件给用户(存用户指定目录,属交付物、非记忆)。
交付物分两层,缺任一层都不算「一套完整版本」(2026-10-08 用户硬要求):
| 层 | 内容 | 位置 | 依据 | 机器判定 |
|---|---|---|---|---|
| 甲 · 成套产物 | ① 病种服务包页面(HTML + assets/)<br>② 产品功能清单/ 文档(按需产出:仅新增页与结构级大改页 —— 非每页一份,页数 ≠ 文档数属正常)<br>③ 更新说明-YYYYMMDD.md(唯一定位:说明本次新生成了哪些 md 文档)<br>④ scale/ 量表作答页(用户提交量表文档时产出;不进编号体系、不出单独文档,但必须在 ③ 里登记——规范E §八) |
<包目录>/ 、 <包目录>/产品功能清单/ 与 <包目录>/scale/ |
规范D + 规范E | review_pkg.py A12 组 + check_docs.py(不含 scale/)+ verify_pkg.py(已扩围扫 scale/) |
| 乙 · 包外产物(唯一一份) | 本次注入-更新范围确认单.md —— 包外只出这一份 |
用户指定目录 | 本 SKILL.md | 7.3.5 人工勾 |
> ⚠️ 甲层是成套交付的硬要求:历史上只有乙层("这次改了什么"),没有一份描述页面本身。甲层由 Step 6.7 产出、Step 7 的 A12 组把关,不通过不得交付。
> ⚠️ 2026-10-10 起甲层的口径:不是「每页都要有文档」 —— 文档是增量说明书(新增页 / 结构级大改页),不是页面全集目录。包内文档数 < 页面数是正常状态。
乙层 = 唯一一份:本次注入-更新范围确认单.md(★ 2026-10-09 用户裁定)
> 用户原话:「输出的内容只有更新范围清单,其他的包外的 md 文档都不要。包内的保持不变。」
> 因此包外不再产出任何其他文件 —— 原先的台账 / 改动摘要 / 校验报告 / 缺陷登记 / 复核配置 / 源包判定单 / 资产清单 / 术语三色表 / 残留矩阵一律取消,内容按下表归位。
| 原先的包外文件 | 现在归到哪 |
|---|---|
本次注入-更新范围确认单.md |
保留,且是唯一包外产物;固定 8 节(见下) |
本次注入-进度台账.md |
取消 —— 状态在对话内保持;每步确认结论写进确认单对应节 |
本次注入-改动摘要.md |
取消 —— 内容并入包内《更新说明》(甲层要求「页面 ↔ 文档对照表 + 本次文档产出小结」) |
本次注入-校验报告.md |
取消 —— 三个脚本的原始输出在对话回复中呈现(贴出来即可),不落文件 |
本次注入-缺陷登记.md |
取消 —— 根因 / 防复发直接回写 references/坑清单(skill 自身资产),结论在对话里给出 |
本次注入-复核配置.json |
取消(不作为交付物) —— 改为临时工作文件(写系统临时目录,复核跑完即删),不得落在用户输出目录 |
本次注入-源包判定单.md |
取消 —— 判定结论写入确认单 §1 |
本次注入-前序病种资产清单.md |
取消(分支 B)—— 写入确认单 §8.1 |
本次注入-术语三色表.md |
取消(分支 B)—— 写入确认单 §8.2(该表仍须作为 scan_residue.py --terms 的临时入参) |
本次注入-残留矩阵.md |
取消(分支 B)—— 写入确认单 §8.3(★ 分支 B 的"逐页清单") |
本次注入-更新范围确认单.md 固定 8 节(Step B4 / Step 5 收口时一次成稿):
| 节 | 内容 | 产出步 |
|---|---|---|
| §1 | 源包类型判定(判据原始输出 + 判定结果 + 分支选择) | Step 0.0 |
| §2 | 病种特点分析与三大上报场景核对 | Step 2 |
| §3 | 病种专项上报内容建议清单(每条附依据与推荐级别) | Step 3 |
| §4 | 两端 + 管理端功能增减矩阵(保留 / 改造 / 停用 / 新增) | Step 4.3–4.6 |
| §5 | ★ 更新范围逐条清单(核心:档位 + 落地方式 + 备份与回滚方案 + 例外登记 + 「已知接受项」) | Step 5 |
| §6 | 量表数量 + 病种化改写后的量表清单(★ 2026-10-11 起不再有「方案」与「文档解析」两个子项;scale/ 页仅在用户主动提交量表文档时产出并登记) |
Step 4.7 |
| §7 | 文档产出范围(本次新增页清单 / 结构级大改页清单 +《更新说明》)—— 未产出文档的页面不必登记 | Step 6.7 |
| §8 | 仅分支 B:8.1 前序病种资产清单 · 8.2 术语三色表 · 8.3 残留矩阵 | Step B1–B3 |
> ⚠️ §2–§4 的分析过程在对话里当场呈现、当场确认,确认后的结论进确认单 —— 目的是不留过程文件,但不丢证据。
> ⚠️ 确认单只增节、不拆文件:分支 B 出 §1–§8;分支 A 出 §1–§7 即止。
> ⚠️ 包外目录里除了这一份,出现任何其他文件都算违反本 skill。
> ⚠️ 回写边界:复核结束后允许向本 skill 自身回写(references/坑清单-已知缺陷与防复发.md、scripts/),这属于工具维护、不是写记忆。
> 但若要改 references/规范A / 规范B / 规范D / 规范E(改规范即改 skill 规则),必须先取得用户确认 —— 依据是用户级刚性约束「对 skill 内容 / 流程的任何修改必须经用户交互确认」,与"是否存在外部正本"无关(本 skill references 全部是本地资产,无外部正本,见文末 references 索引)。
覆盖范围与基线
分支 A(通用型源包)
| 层级 | 覆盖 | 依据 |
|---|---|---|
| 基线页数级 | 46 页 = B01–B11、B13–B15(14) + D01–D04、D08、D11–D13、D15、D19、D21–D31(21) + F01–F11(11),不含 A01(已删除)<br>空号名单:B12;D05–D07、D09、D10、D14、D16–D18、D20(★ 2026-10-11 随访模块下线,D09/D16/D18 并入空号名单,编号留空不复用) |
assets/templates/通用型全病程服务包-V3.3/ + references/模板基线-通用型46页.md |
| 逐页清单级 | B01–B11、B13–B15 + D01–D04、D08、D11–D13、D15、D19、D21–D31 + F01–F11(规范A 中的 A01 段、D09/D16/D18 段均已作废) |
references/规范A(960 行 / 641 行表格 / 471 项,含第 2.5 步 F 段) |
> ⚠️ 若包内页数与上表不符(用户已增删过页面),以实际文件清单为准,并在 Step 0 与用户核对。
> ⚠️ 源包内出现 A01* 文件 → 停下问用户(与「A01 已删除」的既定基线冲突)。
> ⚠️ F 端特点:11 页全部走 CDN 图标库(须改本地,见 24-20);每页均有 XX医院 绑定(1–32 处);F06 含真实姓名「黄国栋」;F03 含糖尿病残留 hba1cValues;F11 含糖尿病量表 id。
分支 B(病种专属源包)
| 层级 | 覆盖 | 依据 |
|---|---|---|
| 无固定页数 | 以源包实际文件清单为准;每页在 Step B4 得到一条处置 |
references/规范C(源包解绑规范) |
> ⚠️ 规范A 在分支 B 不适用 —— 其 471 项绑死在通用型 46 页编号体系上,与专属包(index.html / patient/* / scale/* / 英文驼峰命名等)不是一套。
> 分支 B 的"逐页清单"由 Step B3 现场扫出的残留矩阵承担(页 × 八类载体 × 命中)—— 结论写进 本次注入-更新范围确认单.md §8.3(不再单独出文件)。
> ⚠️ 分支 B 的产物保留源包原有页数与结构,不追求对齐 46 页体系(2026-10-03 用户裁定)。
占位符速查表(分支 A 专用)
> 分支 B 的源包里没有占位符——全是实体值。分支 B 的"替换清单"来自 Step B2 的术语三色表与 Step B3 的残留矩阵(两者均落在确认单 §8,不单独出文件)。
| 占位符 | 含义 | 模板现值 |
|---|---|---|
⟨医院⟩ |
中心医院名 | XX医院 |
⟨科室⟩ |
科室名 | XX科 |
⟨病区⟩ |
住院病区名 | XX科病区 |
⟨病种名⟩ |
病种中文名 | 疾病名称 |
⟨主诊⟩ |
主诊 / 主刀医生 | 医生A |
⟨二诊⟩ |
分管 / 随访医生 | 医生B |
⟨主管⟩ |
扫码 / 主管医生 | 医生C、医生D |
⟨医生组⟩ |
医生组名 | 医生A组 |
⟨主色⟩ |
主题色 | #0072E5 |
⟨术式1/2/3⟩ |
术式名 | 术式A / 术式B / 术式C / 术式D |
⟨症状通道1/2/3⟩ |
症状上报通道 | 出血 / 发热 / 其他症状 |
⟨量表N⟩ |
量表名(现库 12 张) | 见 B07 |
⟨药品N⟩ |
药品名 | 见 B06 |
⟨检查N⟩ |
检验 / 检查项目 | 见 B04 |
⟨课题N⟩ |
科研课题名 | 见 D19 |
⟨病例数N⟩ |
各标签人数 | 见 D08 |
流程 Step 0–7(逐步执行,每步须用户确认后才进入下一步)
> 🔒 执行前先过 T0 门禁:python3 scripts/gate.py check(退出码 0 才继续;2 则向用户索取口令并 unlock)。
> 🔤 再过 T0-b 资源自举:python3 scripts/fetch_fonts.py check(退出码 0 才继续;2 则 fetch)—— 字体缺失时页面图标会静默全废,而所有校验脚本都查不出来。
> 未通过以上两项,不得读 references/、不得跑任何业务脚本、不得进入 Step 0。
Step 0 · 前置:源包类型判定(入口闸门)+ 确认基线与装配规范
0.0 ★ 源包类型判定闸门(强制,判错则全错)
python3 scripts/detect_source_pkg.py <源包目录>
三条判据(原始输出必须贴进台账与判定单):
| # | 判据 | 探什么 | 通用型特征 | 病种专属特征 |
|---|---|---|---|---|
| 1 | 占位符体系 | 疾病名称 / XX医院 / XX科 / XX病区 / 医生A–医生D / 医生A组 / 术式A–术式D |
≥ 5 页命中,且 疾病名称 ≥ 3 次 |
0 命中 |
| 2 | 具体实体值(启发式) | 非占位的具体机构名(…医院)、具体医生姓名(X主任医师 等) |
无(或极少) | ≥ 1 类命中,且占位符命中页数 ≤ 2 |
| 3 | 编号体系(佐证) | 文件名形态 | 符合 B01–B11、B13–B15 + D01–D31 + F01–F11(无 A01,B12 为空号) |
不符合 |
> ⚠️ 不要用「词频/词表」判源包类型。 初版曾用"高频专有短语 ≥3 条"作判据 2,实测把通用型模板也判成病种专属 ——
> 因为无监督提取出的 n-gram 全是滑动窗口碎片,且通用型模板本身就残留着历史底版的量表名。
> 判据 2 因此改为「具体实体值」(通用型写占位符、专属包写实体值,这是两者真正的分界),
> 高频专有短语降级为参考信息(打印出来供人工辨别,不参与判定)。
> 另:若源包目录里嵌套了另一个独立包(如 通用型全病程服务包/),工具会自动分离并提示,判定只针对主包。
判定 → 分支
| 判定结果 | 条件 | 后续 |
|---|---|---|
| 通用型 | 判据 1 成立 ∧ 判据 2 不成立 | → 分支 A:继续 0.1–0.4,按 Step 1–7 + 规范A 执行 |
| 病种专属 | 判据 1 不成立 ∧ 判据 2 成立 | → 分支 B:先走 Step B0–B4(见下节),再回到 Step 0.3 建台账,然后接 Step 1–7 + 规范C |
| 混合(改造到一半) | 判据 1、2 同时成立 | 停下问用户:以哪一端为准;未替换干净的占位符与残留病种词分别列入 Step B1 资产清单 |
| 不可判定 | 1、2 均不成立 | 停下问用户,不得猜测 |
必问三项(不可只靠机器判定):
- 这是什么包?(通用型模板 / 某个具体病种的成品包)
- 若是成品包:前序病种是什么?目标病种是什么?(两者都写进台账)
- 前序病种名一律以源码取证为准——不得凭印象、不得读项目记忆(铁律 T2)
产出:判定结论写入 本次注入-更新范围确认单.md §1(判据原始输出 + 判定结果 + 分支选择 + 用户确认)。
0.1 装配规范(按分支取用)
| 文件 | 分支 A | 分支 B | 用途 |
|---|---|---|---|
assets/templates/通用型全病程服务包-V3.3/ |
✅ 基线 / 默认源包 | ❌ 不适用 | 差异盘点基准;用户未给源包时作注入起点(只读,不可就地改) |
references/模板基线-通用型46页.md |
✅ 必读 | ❌ 不适用 | 46 页清单 + SHA256 + 差异盘点判定规则 + 模板维护规则 |
references/规范A-病种注入执行清单-V2.md |
✅ 必读 | ❌ 不适用(编号体系不匹配) | 46 页口径的逐页注入项(A01 段已作废) |
references/规范B-新建页面规范-V2-医患两端.md |
✅ 必读 | ✅ 必读 | 外壳 / 组件 / 闭环 / 定制化 / 卡片格式 / 硬规则 |
references/规范C-源包解绑规范.md |
❌ 不适用 | ✅ 必读 | 分支 B 的逐页依据(解绑全流程) |
references/坑清单-已知缺陷与防复发.md |
✅ | ✅ | Step 7.5 根因库 |
再读取目标源包目录,核对实际页面清单。
> ⚠️ 源包从哪来必须问用户:① 用户自带目录 / zip;② 用 skill 内置模板(assets/templates/…)。
> 不得默认取模板 —— 用户手上可能是已改过、已填过真实数据的版本(误判会覆盖既有成果)。
0.2 确认基线状态(必问)
| 问题 | 影响 |
|---|---|
| 服务包目录路径?(支持目录或 zip) | 执行目标 |
| 源包是你自带的,还是用 skill 内置的通用型模板? | 决定 Step 6.1 走「基线参照」还是「复制模板」 |
| 当前包是「未改动的初版模板」还是「已改造过 / 已填过真实数据的版本」? | 决定替换基准与 Step 5 的风险档位 |
| 若是已改造版本:改造过哪些页?(可只答"不清楚",则先跑一次差异盘点) | 防止覆盖既有成果 |
基线核对的现成手段(分支 A)
TPL="$HOME/.workbuddy/skills/病种注入器/assets/templates/通用型全病程服务包-V3.3"
diff -rq "$TPL" <用户源包目录> 2>&1 | grep -v '\.DS_Store' # 空 = 与内置模板逐文件一致
| 结果 | 结论 | 处置 |
|---|---|---|
| 无输出 | 源包 = 未改动的初版模板 | 可直接进入 Step 1 |
| 少量页不同 | 用户已改过部分页 | 停下报告,逐页确认是否覆盖 |
| 页数不符 / 大面积不同 | 源包不是本模板直系(可能已深度改造,或页数体系不同) | 以源包实际文件为准,与用户重新核对基线 |
出现 A01* 文件 |
与「已删除 A01」的既定基线冲突 | 停下问用户,不得自行处置 |
详见 references/模板基线-通用型46页.md §3。
0.3 建立唯一包外产物:更新范围确认单
在用户指定目录创建 本次注入-更新范围确认单.md(包外只此一份,见 T3),先把 §1(源包判定)填上。Step 0–7(分支 B 另加 Step B0–B4)的每步确认结论逐节追加进去;状态在对话内保持,不再另立台账文件。包外目录里除这一份外不得出现任何其他文件。
0.4 前置声明
向用户声明:本次执行不读记忆、不写记忆;非明确不改(分支 B 另适用 T1-b 例外条款);本次走分支 A / 分支 B。
输出:确认单已建,§1 已填(源包判定 + 页面基线确认:页数 / 编号 / 文件名 / 基线状态)。
★ 分支 B 前置阶段 · Step B0–B4(逐页依据 = 规范C-源包解绑规范.md)
> 仅当 Step 0.0 判定为「病种专属」时执行。
> 目标:把前序病种语义从整包里解绑干净,再注入目标病种。
> 顺序硬约束:B1–B4 全部完成并经用户确认后,才允许进入 Step 1。
| 步 | 名称 | 做什么 | 产出 |
|---|---|---|---|
| B0 | 源包类型判定闸门 | 即 Step 0.0(已在本步之前完成) |
判定单 |
| B1 | 前序病种资产清点(六类) | 专属页面 / 专属内容资产群 / 专属术语 / 专属时间轴口径 / 专属字段与字典键 / 专属标识与注释 | 确认单 §8.1 |
| B2 | 术语三色分类(动态提取) | 从源包提取候选词 → 逐词判定 🟢绿(可全局替换)/ 🟡黄(禁止全局替换,逐处判定)/ 🔴红(禁入替换清单),每词写理由 | 确认单 §8.2(同时作为 scan_residue.py --terms 的临时入参) |
| B3 | 八类残留载体全包扫描 | 文件头注释 / 标题模块名 / JS 演示数据 / UI 文案档位 / 时间轴口径 / 字典映射键 / 内容资产群 / 机构团队文案 | 确认单 §8.3 ★ 分支 B 的"逐页清单" |
| B4 | 逐页处置决策 + 用户确认 | 每页给「整篇重写 / 局部改写 / 删除页 / 保留 / 镜像同步」;代码注释、字典键、标识符单列待确认 | 确认单 §5 + §8 |
分支 B 的四条硬约束(对应审计四大教训)
- 🟡 黄词的处置必须先于、或至少与 🟢 绿词替换同页成对完成。
严禁"先全局替换病种名,周边语义以后再补"——审计实测产出「慢性胃炎术后需要扩肛」这类语义荒谬组合,且因旧值已 0 命中,现有 B1 组查不出来(新增 A9-3 专查,见 §7.0)。 - 删除页必须同步:文件 / 全部入口链接 / 页面索引(+ 若包内另有页数计数器则一并同步)。审计里出现过"入口清了、列表展示名还在"。
- 镜像对必须同批处理:识别出的 B 端 ↔ D 端镜像页不得只改一端——审计中
B07/B45患者端已重写而D18/D22等医生端整批落下(新增 A9-4 专查)。 - 内容资产群整篇重写,不做字符串替换:入组问卷、科普文章库、病历模板、量表题库、标签库、科研队列、预警类型表、随访模板库——字符串替换会产出自相矛盾的题项。
执行顺序(Step 1–7 内的差异)
| 原步骤 | 分支 B 中的差异 |
|---|---|
Step 1–3 |
完全复用 |
Step 4 |
4.1 / 4.2 两道闸门照走;逐页处置依据改用 B4 逐页处置清单(不用规范A) |
Step 5 |
确认单增加三项:时间轴目标口径(三选一,全包唯一)、🟡黄词逐处处置、删除页四处同步清单 |
Step 6 |
以"页"为单位,每页先解绑、再注入,同页成对做;禁止"先全包解绑、再全包注入"两遍走 |
Step 7 |
原四层复核 + 规范C §10 解绑验收组 C-1~C-9(机器判定 = review_pkg.py 的 A9 组) |
Step 1 · 确认机构与人员
必问三项(点选 + 自由输入,不要一次问太多):
| 项 | 占位符 | 说明 |
|---|---|---|
| 中心医院名称 | ⟨医院⟩ |
模板占位 XX医院 |
| 科室名称 | ⟨科室⟩ |
模板占位 XX科;含病区写法 XX科病区 |
| 医生 | ⟨主诊⟩ ⟨二诊⟩ ⟨主管⟩ ⟨医生组⟩ |
模板占位 医生A / 医生B / 医生C / 医生A组 |
医生角色定义(写入前与用户对齐)
| 角色 | 含义 | 出现页 |
|---|---|---|
⟨主诊⟩ |
主诊 / 主刀医师 | 多数页(D03/D25/D26 等) |
⟨二诊⟩ |
分管 / 随访医生 | D03/D25/D29/D30 |
⟨主管⟩ |
扫码 / 主管医生 | D03 患者卡 .scan |
⟨医生组⟩ |
医生组名(默认 <主诊医生名>组) |
头部 hm-role |
医生名未确定时的处理(必做)
- 联网检索:「
<医院名><科室名>医生」「<医院名><科室名>专家团队」,优先官网科室页 - 来源优先级(从严)
| 可用 | 不可用 |
|---|---|
| 医院官网科室/专家页 | 百科词条 |
| 卫健委 / 官方挂号平台公示 | 自媒体、问答、论坛 |
| 权威媒体报道 | 任何推测、拼接、同名猜测 | - 整理候选:姓名 + 职称/职务 + 来源链接,逐条标注出处
- 点选让用户选定;用户选"仍不确定" → 保留
医生A/医生B占位(合规做法,不得臆造)
必问:是否将真实医生姓名写入页面
演示 / 对外展示场景可能不宜用真名。先问,不默认写入:
| 选项 | 结果 |
|---|---|
| 写真实姓名 | 按选定值替换 医生A/B/C |
| 保留占位 | 维持 医生A/B/C,仅替换医院与科室 |
硬约束
- 禁止编造医生姓名;检索不到就如实说明并保留占位
- 检索结果必须标注来源,不得把推测当事实
- 医生组名默认
<主诊医生名>组;若医院无此建制,与用户确认命名
输出:机构人员映射表(占位符 → 实际值)+ 实名写入决策,交用户确认。
Step 2 · 病种特点分析 + 三大上报场景核对
先联网检索该病种的「诊疗规范 / 随访指南 / 术后或康复管理常规」,作为建议依据。
再逐项核对三大场景(每一项给出「建议值 + 理由 + 依据」,用点选让用户确认或修改):
① 症状上报(模板 B03-症状上报-患者端.html)
| 配置项 | 模板现值 | 需确认 |
|---|---|---|
上报通道(.rs-tab) |
出血上报 / 发热情况上报 / 其他症状上报 | 通道数、名称、图标 |
分级(.grade-list > .grade-opt) |
0–4 级 | 级数、每级描述 |
阈值档位(.alert-green/orange/red) |
绿/橙/红 三档 | 各级阈值 |
其他症状(OTHER_SYMPTOMS) |
每项 4 档描述 | 症状项与档位描述 |
时间口径(.tp-sub) |
入组第 N 天 |
术后 / 入组 / 疗程第 N 天(三选一,全包统一) |
② 健康日记(模板 B05-健康日记-患者端.html)
| 配置项 | 模板现值 | 需确认 |
|---|---|---|
| 打卡项 | 血压 / 运动 / 睡眠 / 体重(4 项) | 增减项 |
| 单位与录入方式 | 收缩压/舒张压 + mmHg |
单位、指标 |
| 数值正常范围 | 90–139 / 60–89 | 按病种定 |
| 综合记录区块 | 运动分类 / 时长 / 睡眠 / 体重 | 区块与选项 chips |
③ 用药打卡(模板 B06-用药打卡-患者端.html)
| 配置项 | 模板现值 | 需确认 |
|---|---|---|
药品类型分组(MED_GROUPS) |
药膏 / 栓剂 | 口服 / 外用 / 吸入 / 注射 / 其他 |
| 粒度 | 周(.week-picker) |
不询问、不得更改 —— 全病种一律按周打卡(2026-10-07 用户裁定) |
频率选项(FREQ_OPTS) |
每日 / 每周 2-3 次 / 每周 1 次 / 不使用 | 按病种 |
| 用药管理(长期清单) | B06 第 ④ 段独立 .section-card;D12 .act-bar 下方 #medMgr |
药库随 MED_GROUPS / MG_LIB 一并替换;段位与共键 medlist:<患者> 不得改(规范B §5.1「用药管理」) |
粒度规则(硬性 · 不询问):用药打卡一律按周,控件固定 .week-picker,全病种唯一口径。
Step 2不询问粒度,Step 5确认单不列粒度项 —— 不得把它做成待选项- 禁止改为按日(
.time-picker/.day-picker)或按月(.month-picker) - 全包不得出现
.day-picker/.month-picker - 规则详见 规范B §5.1;机器校验
review_pkg.pyA11 组(2026-10-07 新增)
该病种不需要某场景时
不得在本步直接删页面。→ 记入 Step 4 的「停用」建议(需用户确认,并检查引用与索引)。
硬约束:三场景的通道 → 分级 → 阈值必须前后同源,且与医生端承接页(D01 #alarmWrap / D11)一致。改一端必同步另一端。
输出:三大场景配置表(建议值 + 用户确认值),交用户确认。
Step 3 · 提出病种专项上报内容建议
基于 Step 2 的病种特点,提出该病种特有的(模板里没有、但临床上需要的)上报项。
建议项字段
| 字段 | 说明 |
|---|---|
| 上报项名称 | 如「疼痛评分」「血糖监测」「化疗后反应」 |
| 归属 | 症状上报 / 健康日记 / 用药打卡 / 某个现有页面内的新增功能项(⚠️ 不得填「新增独立上报页」 —— 见硬约束 4) |
| 采集内容 | 具体字段与选项 |
| 采集频次 | 每日 / 每次发生 / 随访节点 |
| 推荐级别 | 推荐 / 可选 / 不建议(含原因) |
| 依据 | 指南或诊疗常规出处 |
条数与排序:建议 3–8 条,按推荐级别降序,避免一次给出过量项。
硬约束(因是通用型模版,建议必须严谨可靠)
- 每条建议必须有病种依据,不得为凑数而建议
- 明确标注推荐级别;不建议的项要写清原因(与现有通道重复 / 临床价值低 / 增加患者负担)
- 不得建议上线未经临床验证的自评量表
- ★ 2026-10-11 用户立规:不得向用户建议新增功能页面(页)。
建议项的「归属」只能落在现有页面(症状上报 / 健康日记 / 用药打卡 / 其他已建上报页)——
不得把「新增一个独立上报页 / 独立功能页」作为建议项提出,任何推荐级别(含「可选」「不建议」)都不行。
- 边界(只禁"新增独立页"):同一页内新增功能按钮 / 功能项 仍可建议
(例:「在B03增加一个『疼痛评分』通道」✅;「新增一个『疼痛评分上报页』」❌)。
- 用户主动提出时不受限:用户自己说要新增页面 → 照常走 Step 4.2 闸门
(需求描述 → 功能需求卡 → 回读确认),并同轮给出中心医护端三段承接方案。
- 页面清单的增减建议(4.6 硬约束 2)、功能按钮 / 功能项的新增建议(闸门 ②)不受本条影响。
输出:专项上报建议清单,用户逐项勾选。
Step 4 · 两端功能列表确认 + 新增功能征询 + 量表数量 + 增减建议
> ⚠️ 本步含三道强制闸门(2026-10-08 用户硬要求)· 分支 A / B 通用:
> 4.1 功能列表确认闸门 → 4.2 新增功能征询与需求二次确认闸门 → 逐页处置建议(4.3–4.6)→ 4.7 量表数量确认(★ 2026-10-11 收窄:不问方案、只问数量)。
> 三道闸门未取得用户明确确认,不得进入下一步、不得动任何页面。
4.1 ★ 两端功能列表确认(强制闸门)
向用户逐条列出两端的功能清单,交用户确认。未确认不得进入 4.2。
| 端 | 清单粒度 | 列出内容 |
|---|---|---|
| 患者端(B 系列) | 逐页 | 页面号 + 页名 + 一句话功能 + 本次处置(保留 / 改造 / 停用) |
| 中心医护端(D 系列) | 逐页 | 同上 |
- 清单以当次源包的实际文件清单为准(分支 A 通常
B×14 +D×21;分支 B 以实际页数为准) - 用户可逐条或批量确认;用户提出异议的条目就地修订后重新列出,不得只改一处不回报
- 管理端(F 系列)清单在 4.6 单独列出与确认
产出:两端功能清单确认结果 → 写入 本次注入-更新范围确认单.md。
4.2 ★ 新增功能征询与需求二次确认(强制闸门)
| 步 | 动作 | 判据 / 硬约束 |
|---|---|---|
| 4.2.1 征询 | 明确询问用户:「是否需要增加新的功能按钮 / 功能项?」<br>答「否」→ 记录「本次无新增功能」,直接进入 4.3 | 不得替用户默认「不需要」;不得因模板够用就不问 |
| 4.2.2 需求描述 | 请用户逐条描述每个新增功能的详细需求;下表要素缺失时逐项追问,不得自行补位 | ⚠️ 用户描述含糊时必须追问到能写进需求卡,不得"先做着看" |
| 4.2.3 梳理 | 把用户的口语描述整理成结构化「功能需求卡」(见下表) | 只整理,不发明;用户没说的不写进卡 |
| 4.2.4 ★ 回读确认 | 把「功能需求卡」原样回读给用户,明确提问:「以上理解是否正确?」<br>答「正确」→ 进 4.2.5;指出偏差 → 回到 4.2.2 重新梳理并再次回读 | ⚠️ 未取得「正确」这一明确答复前,不得动任何页面 |
| 4.2.5 执行 | 严格按 references/规范B-新建页面规范-V2-医患两端.md 执行,逐项过其自检清单(含「0. 铁律闸门」7 项;含 §十一 E / H 的「历史卡片行序 + 时间行文案」强制项,对照 §3.3.2) |
同 Step 6.3 |
4.2.2 需求描述必备要素(缺一项追问一项)
| 要素 | 追问示例 |
|---|---|
| 功能名称 | 这个功能叫什么? |
| 归属端 | 患者端 / 中心医护端 / 管理端? |
| 入口位置 | 从哪里进(功能宫格 / 列表按钮 / 页内按钮 / 卡片)? |
| 解决的问题 | 谁在什么场景下用它?不做的后果是什么? |
| 页面要素 | 要展示什么、要填什么、有哪些状态? |
| 数据来源 | 患者填 / 医生填 / 系统派生 / 接口? |
| 与现有功能的关系 | 复用既有页面,还是新增独立页面? |
4.2.3 功能需求卡(逐条一份)
| 项 | 内容 |
|---|---|
| 功能名称 / 页面编号(新增页给新编号) | |
| 归属端与入口位置 | |
| 页面骨架(分区顺序) | |
| 字段与状态机 | |
| 数据键(含跨页共键) | |
| 中心医护端承接 | 患者端上报页须配套三段承接:D01 功能图标 + D01 #alarmWrap 预警展示 + D04 功能图标单患者入口 |
| 是否新增独立页面 | 是 → 走 4.2.5(规范B);否 → 归入 4.3–4.6 的「改造」处置 |
4.2 硬约束
- ⚠️ 新增必须成对:患者端上报页 → 中心医护端必须配套三段承接,不得单侧断档
- ⚠️ 编号规则(★ 2026-10-11 用户裁定 · 替换原「沿用包内既有编号体系」口径):
新增页一律不进B/D/F系列,统一命名为X{NN}-{患者端|医生端}-{功能名称}.html——
X大写;每端各自从01起(X01-患者端-疼痛评分上报.html/X01-医生端-疼痛评分处理.html);
模板原有页仍用B/D/F;对应的《产品功能清单》md 同规则命名(X01-患者端-疼痛评分上报-A.md),
不得新增B/D/F系列文档。原规则「新增页沿用包内既有编号体系」作废(规范B §9.1 / 坑清单 R3-30)。
⚠️ 「空号不补位、不重排」对模板原有页仍然有效 —— 该条只管原有页的删除与留空,与新增页走X体系并行不冲突。 - ⚠️ 需求未经二次确认的,一律不得进入执行
- ⚠️ 不得为凑数而建议新增:新增与否由用户裁定,AI 只负责提问、梳理与回读
产出:功能需求卡 + 用户「正确」答复记录 → 并入 本次注入-更新范围确认单.md。
4.3 患者端(B 系列 14 页)★ 4.1 确认后的逐页处置依据
逐页给出处置建议:
| 处置 | 含义 |
|---|---|
| 保留 | 通用功能,与病种无关,不动 |
| 改造 | 保留结构,替换内容(按规范A 清单执行) |
| 停用 | 该病种不需要,从入口摘除(页面文件是否删除由用户定) |
| 新增 | 该病种需要的新功能(须先过 4.2 闸门,再走 4.2.5 / Step 6.3 新建页面流程) |
B01 主页 / B02 我的 / B03 症状上报 / B04 我的档案(已无「患者基本信息」卡)/ B05 健康日记 / B06 用药打卡 / B07 我的量表 / B08 日程管理 / B09 日程管理-日历 / B10 健康宣教 / B11 上传资料 / B13 系统通知 / B14 健康报告 / B15 健康报告详情
> B04 我的档案 · 已无「患者基本信息」卡、D26 资料汇总同(2026-10-07 用户裁定):两页 .patient-card 整块(12 个 .pi-item)与其 9 条 CSS 已删除,.content 内首个元素即「模块 Tab」+ .tab-scroll,4 个 tab 与全部 panel 保留。规范A 原注入项 4-15 / 19-6(患者卡 12 项字段)已作废。
> 同两页三个 tab 已改「平铺 + 时间降序 + 来源标签」(2026-10-07 第二轮裁定):「就诊记录 / 院内化验 / 外院化验 / 本院检查 / 外院检查」五个分组外壳与 #visitCnt 计数全部移除;来源标签统一 .src-tag 四类(来源 院内/院外 + 渠道 his获取/患者上传),映射 REC_SRC、渲染 srcTags()。规则见 规范B §6.4、注入项见 规范A 4-16/4-17/19-9。
> 检查报告卡已并入化验卡 .lab-card(2026-10-07 用户裁定,杜绝第二套卡片样式):renderExam() 改用 .lab-card + .lab-crow1(检查名称 · 日期 · 来源标签 · [重点] · 箭头)+ .lab-crow2(检查科室)+ .lab-body,展开区小标题/正文用 .lab-sec/.lab-txt,重点项用 .lab-badge 胶囊;.rep-* 17 条 CSS 与 srcIcon() 全部删除。化验卡与检查卡的外观与行结构必须逐项一致。⚠️ D28 的 .rep-acts/.rep-btn/.rep-tip 属健康报告操作区,与本卡无关。
> B10 健康宣教 · 已无 tab、无横幅(2026-10-07 用户裁定):原两级 tab(「宣教打卡 / 科普小知识」)与顶部科普横幅(「疾病管理小知识」+ 正文)整体移除,.content 内只剩宣教打卡列表;标题固定为「健康宣教」。
> 页面内 PUSH_NODES / ARTICLES / FROM_MAP 的注入项照旧(规范A 10-1 ~ 10-4、10-6),原 10-5(科普区 4 类)已作废。
> 标准数值类上报项一律「拖动滑条 + 点选快捷值」(2026-10-07 用户裁定):血压 / 血糖 / 体温 / 体重 / 心率 / 血氧 / 疼痛评分等定量指标,参照 B03 发热上报的「当前体温」,用 .trk-* 滑条 + .qk 快捷值(结构)与 mkNum() 工厂(实现)承载;禁止用 <input type="number"> / .bp-input / .weight-input 文本框。分级配色只用语义四色(绿 #0E9E56 / 黄 #B8890B / 橙 #E67E22 / 红 #D0021B),色带按阈值百分比分段(不是等分)。B05 健康日记的血压(收缩压 / 舒张压各一条滑条)与体重已在同轮完成改造。规则见 规范B §3.2.1(+ §5.3),注入项见 规范A 3-12 / 5-3 / 5-4 / 5-7,收尾核验 规范A 25-24 / 25-25。
> B02 我的 · 诊疗信息卡随病种类型切换(2026-10-07 用户裁定):由 PACKAGES[].kind 决定卡面 —— 手术类('surgery')= 诊断名称 / 手术名称 / 手术日期(3 行),非手术类('diag',高血压 / 糖尿病 / 康复 / 儿童视力发育等)= 诊断名称 / 诊断日期(2 行);首行统一叫「诊断名称」。卡面、修改表单字段、③ 确认弹层文案三处同时切换(medKind() / dateLbl() / recDate() / recFromHis() 派生)。
> 卡片右侧操作区固定两枚按钮:同步医院数据(前)+ 修改 / 去完善(后)。同步走接口取该患者诊疗数据并直接覆盖本地记录(不走清空确认);成功后 toast「已从医院系统同步到诊疗数据」。原型接口由 mockFetchMed() 模拟,接真实接口只替换该函数。
> 规则见 规范B §5.5(+ 自检清单 C1b),注入项见 规范A 2-5 ~ 2-10。
> B11 上传资料 · 历史区已改口径(2026-10-07 用户裁定):① 标题「历史上传记录」→ 「历史数据」(合规 规范B §2.4 B-4,review_pkg A6-3 对该页的 FAIL 已消除);② 历史卡片新增审核三态胶囊 待审核(琥珀)/ 已审核(绿)/ 已驳回(红),文案表 HIS_STATE、类名 .his-tag.wait/.ok/.no(⚠️ 2026-10-10 由 .his-state 收敛为 .his-tag);③ 历史卡片不显示文件大小(副行只留「类型」、时间归行3),待提交区 .pk-item 仍显示大小;卡片骨架统一为 规范B §3.3.3 的 .his-*;④ 演示种子 uploaded 6 条三态齐全、时间走 TS(),新提交一律 state:'wait'。规则见 规范B §3.3.1,注入项见 规范A 11-2 ~ 11-6,收尾核验 规范A 25-26。
4.4 中心医护端(D 系列 21 页)
D01 工作台 / D02 预警列表 / D03 患者列表 / D04 患者全景视图 / D08 标签管理 / D11 症状上报处理 / D12 用药打卡处理 / D13 患者量表处理 / D15 量表管理 / D19 科研管理 / D21 我的 / D22 资料管理 / D23 宣教管理 / D24 健康日记 / D25 患者日程(孤儿页,见下)/ D26 资料汇总(已无「患者基本信息」卡)/ D27 健康报告 / D28 健康报告详情 / D29 沟通 / D30 沟通会话 / D31 健康报告审核(2026-10-07 新增)
> ★ 2026-10-11 用户裁定:随访模块整体下线 —— D09-新建随访计划 / D16-随访管理 / D18-随访进度 三个页面文件已从模板删除,(D01、D21 两处指向 D16 的入口同步删除),编号 D09 / D16 / D18 留空、不复用;F06-随访计划管理(管理端)保留(管理端随访模板属另一条线,未在本次裁定范围内)。⚠️ 注入时不得把这三个 D 页加回来;规范A 中 D09 / D16 / D18 三段已作废。
> ★ D25-患者日程 保留为孤儿页(2026-10-11 用户裁定):文件保留,但 D04 的三处入口(功能菜单项 / 「患者日程」区块 / 该区块 JS 生成的节点链接)已全部删除;患者端 B08 / B09 日程管理保留不动。
> D31 · 健康报告审核 —— 由 D01 主宫格「健康报告」进入。以患者为卡片,汇总全院待审核 + 待推送的健康报告(结构与 D22-资料管理 同构:概览条 + 搜索/筛选 + 患者卡);点击患者卡 → D27-健康报告-中心医护端.html?name=<患者>。
> 审核/推送状态取自 localStorage 键 rptedit:<患者>,与 D27 / D28 共用同一把键,故三页状态恒一致。
> ⛔ D04 患者日程 · 已整体下线(★ 2026-10-11 用户裁定)——
> 原「三态节点(绿 .dot.on 已完成 / 红 .dot.od 逾期 / 蓝 .dot.off 待执行)+ .sc-nm 日程名 + 色板与图例」整块能力已从 D04 移除:
> ① 「日程管理」功能按钮(.func-* 宫格项)已删;② 「患者日程」展示区块已删;③ 该区块的 JS 节点渲染入口已删;
> ④ 配套的 .sc-* 三态 CSS 与 SCHED / renderSchedRow 等 JS 已按死代码一并清除。
>
> ⚠️ 注入时不得把日程区块加回 D04;规范A 的 4-10 / 4-14(D04 日程项)已作废。
> ⚠️ 患者端 B08 / B09 的日程管理不受影响、保持原样;D25-患者日程 文件保留为孤儿页(无入口)。
> ⚠️ 规范B §4.2.1 日程三态色板章节保留(B08 / B09 仍读同一套 patsched: 键与色板),但适用范围收窄为患者端两页(原先写的是「D04 / D25 / B08 / B09」)。
D01 功能宫格变更(2026-10-07,注入时不得破坏)
| 区域 | 现状 | 变更说明 |
|---|---|---|
主宫格 #funcGrid |
5 格:症状上报 / 用药打卡 / 患者量表 / 健康报告 / 全部功能 | 「资料管理」移出,「健康报告」移入(fc-a 业务蓝,位于「全部功能」之前)。格数不变,.func-grid 仍为 repeat(5,1fr) |
展开区 .func-sub |
5 格 · 单行:科研管理 / 标签管理 / 量表管理 / 宣教管理 / 资料管理 | ★ 2026-10-11:「日程管理」项已删除(它本是随访模块唯一入口,指向 D16-随访管理)。现为 5 格单行,.func-sub 仍 repeat(5,1fr) —— 正好一行放满,没有换行项 |
待办面板 #rptWrap |
位于 #upWrap 与 #catWrap 之间 |
新增「待审核健康报告」面板(紫色系 .rp-*,结构同构 .up-*),数据 RPTS 与 D27/D31 的 REPORT_SETS 同源,三处改动需一起调 |
> ⚠️ 注入时若改病种导致功能增减,必须守住三条:① 主宫格只放 fc-a(业务蓝),展开区只放 fc-b(管理紫) —— 混用会被 review_pkg.py 的 A7-2 判 FAIL;② 两区一律每行 5 个(repeat(5,1fr)),项数超出即自动换行(★ 2026-10-11 后的基线:主宫格 5 项=1 行;展开区 5 项=1 行);③ 不得为了"填满一行"去改 repeat(N,1fr) 的 N —— 列数口径全包唯一,改它等于破坏一致性。
> ⚠️ ★ 2026-10-11 追加:不得建议或自行添加功能宫格项(见 Step 3 硬约束 4)—— 宫格项与页面一一对应,加减都必须先由用户提出。
4.5 入口页 A01 —— 已删除,不适用
A01(原型入口页)已由用户从服务包中删除(2026-10-07 确认)。本 skill 全流程不再处理 A01:
- 通用型包为 46 页(
B×14 +D×21 +F×11),不含任何A01 - 不再有「索引链接 + 三处计数」的注入与核验项(规范A / 规范B 的 A01 条目已同步作废)
- 若源包内意外出现
A01*文件 → 停下问用户,不得自行处置
4.6 管理端(F 系列 11 页)→ 清单见 references/规范A「第 2.5 步」(下为速览)
| 页 | 行数 | 注入要点(全局替换级) |
|---|---|---|
F01-管理端主页 |
89 | XX医院 ×2(标题 / 署名) |
F02-查询统计 |
94 | XX医院 ×3;allData/names/surnames/given/risks 为随机演示数据(一般不换) |
F03-数据下载 |
198 | 重点页:diseaseTypes(病种类型数组)、institutions/depts/counties(机构维度)、hba1cValues(糖尿病残留,必改);XX医院×23、疾病名称×13、XX科×4 |
F04-科研管理 |
156 | 医生A×6、术后×6、XX医院×1 |
F05-全病程管理总览 |
142 | XX医院×6;allData/surnames/given/risks |
F06-随访计划管理 |
431 | 重点页:XX医院×32(全包最多)、随访计划模板;出血/术后/入组第 各 1 |
F07-全病程驾驶舱 |
136 | statInfo;疾病名称×2、出血×5 |
F08-质控看板 |
123 | XX医院×10 |
F09-检验检查报告管理 |
83 | XX医院×7、结肠镜×1 |
F10-症状上报管理 |
83 | XX医院×7、出血×2 |
F11-量表管理 |
772 | 重点页:scaleData/targets/qData/opts、XX医院×22、出血×2 |
> 上表为速览;逐字段清单以 references/规范A 第 2.5 步为准(26-1 ~ 36-6 共 44 项)。
硬约束(建议必须严谨可靠)
- 不得为凑数而建议新增;每条建议附病种依据
- 停用前必须检查:该页是否被其他页引用(失效链接)、是否在页面索引中登记
- 停用后编号规则:保留空号、不重排(沿用包内既有做法);在
TSV剔除区追加留档 - 新增必须成对:新增患者端上报页 → 医生端必须配套三段承接(
D01功能图标 +D01 #alarmWrap预警展示 +D04功能图标单患者入口),不得单侧断档
(⚠️ 新增页须先由用户提出 —— AI 不得主动建议新增页,见 Step 3 硬约束 4;用户主动提出后按本节流程走) - 医生发起类业务(量表推送 / 健康报告 / 用药调整)须两端闭环齐全(规范B 第四章六项自检)—— ⚠️ 「日程管理」已不是医生端业务(2026-10-11 医生端日程下线)
4.7 ★ 量表数量确认(★★ 2026-10-11 用户裁定:不问方案、只问数量 · 在 Step 5 范围确认之前走完)
> 用户原话:「在向用户确认量表页功能的时候,去掉通过 excel 生成量表的功能提问选项,统一按照默认模拟量表的方式执行,可以问用户做几个模拟量表。
> 同时保留生成量表页面的功能,但不向用户展示,也不执行。」
4.7.1 ★ 唯一提问:本次做几个模拟量表
| 项 | 规定 |
|---|---|
| 问什么 | 只问一句:「本次做几个模拟量表?」—— 默认 3 个,建议区间 1–6(用户可自由给数) |
| 不问什么 | ❌ 不再问「量表方案」(~~沿用模板量表库 / 按我的要求改 / 我有量表原始文档 / 本期不改~~ 四选一已作废);<br>❌ 不得主动提「你可以提交 Excel / Word / PDF 量表文档」;<br>❌ 不得把「提交量表原始文档」列进任何菜单、提示、确认单选项或建议清单 |
| 默认模拟量表从哪来 | 沿用模板既有量表库(B07 10 条 / D15 7 条 / F11 12 条)按目标病种改写名称与维度;不每轮新造题库结构、不新增 scale/ 作答页 |
| 用户要的数量 > 库内条目数 | 先问用户(复用 / 扩充 / 减量),不得自行编造量表 |
4.7.2 病种化改写(按用户给定的数量执行)
- 在模板既有量表库中取 N 条,按 Step 2 的病种特点改写:量表名 / 维度 / 题项措辞 / 计分口径(结构不动)
- 不产出
scale/页面:改的是B07(患者端量表库)/D15(医生端量表管理)/F11(管理端量表管理)中的既有条目 - 六处同源登记照旧:
B07↔D13/D15/D19/D04/D30,同名量表措辞逐字符一致;机器判定review_pkg.pyA4 组 - 改写后的量表名与维度在 4.1 功能清单确认时一并列出交用户核对(不单独回读、无「解析确认」环节)
4.7.3 ⏸️ 冻结能力(保留在包内 · 不展示 · 不执行)
| 资产 | 状态 |
|---|---|
references/规范E-量表文档转HTML页面规范.md |
保留(不删除、不修改),默认不读取、不执行 |
references/规范F-量表报告生成规范.md |
同上 |
scripts/scale_doc_extract.py |
同上(不主动跑) |
scripts/check_scale_docs.py |
同上(包内无 scale/ 时本就「不适用直过」,可不跑) |
> 唯一例外(用户主动时恢复):用户自己提交了量表原始文档 / 明确要求「按我的量表生成作答页」时 —— 才恢复走 规范E
> (解析 → 回读确认 → 生成 scale/<短名>.html + 同短名报告提示词 md → 过 check_scale_docs.py)。
> ⚠️ AI 不得主动提起这条路径;用户没提,一律按 4.7.1–4.7.2 走。恢复执行时的完整流程见本文件 附录·冻结路径(文末)。
4.7.4 管理端 F11 的同步改造(★ 2026-10-11)
F11-量表管理-管理端.html 里的「导入题目 / Excel 上传 / 下载模板」整套 UI 已从模板删除
(它是「通过 Excel 生成量表」的唯一真实入口,留着与「不展示、不执行」矛盾)。
⚠️ 注入 / 改页时不得把它加回来;机器判定 = review_pkg.py A15 组(新增)。
输出:① 两端功能列表确认结果(4.1)② 功能需求卡 + 用户「正确」答复(4.2)③ 各端功能增减建议矩阵(4.3–4.6)
④ 量表数量 + 病种化改写后的量表清单(4.7)—— 四者均交用户确认,并一并写入 本次注入-更新范围确认单.md。
4.7-附 ★ 冻结路径(仅在用户主动提交量表文档时启用)
> 本节是 2026-10-11 之前的 4.7 全文,原样保留供恢复执行时对照。AI 不得主动引用本节、不得主动提议走这条路。
| 步 | 内容 |
|---|---|
| ① 解析 | python3 scripts/scale_doc_extract.py "<文档>" --out "<包目录>/scale/_src/量表解析-<原文件名>.json";xlsx/docx 走 zip+XML 纯标准库直读,csv/tsv/txt/md 直读;pdf 由模型逐页阅读(扫描件 / 双栏 / 混排表格尤须逐页核对);原件存档到 <包目录>/scale/_src/ |
| ② 回读确认(★ 未拿到「正确」前不得生成任何页面) | 原样列给用户:量表名(全称+缩写)/ 维度 / 题数 / 每题题干与全部选项(含顺序) / 计分规则(含反向计分、分值区间)/ 是否接入报告;缺项逐项追问(清单见 规范E §2.2)。答「差不多 / 基本对 / 大概」不算通过 → 重新回读 |
| ③ 生成作答页 | 严格按 references/规范E:产出 <包目录>/scale/<短名>.html(单页自包含、可填写、可提交);页面数据一律走页顶 SCALE_DEF;题目只放作答页,不得塞进 B07 的 SCALES[].groups[].qs;相对路径一律 ../assets/...;严禁 CDN |
| ④ 配套报告提示词(★ 每张量表一份 · 无条件) | 产出 <包目录>/scale/<短名>.md —— 与作答页同短名、同目录,只差扩展名;严格按 references/规范F(12 节骨架 + 8 变量 + 必含句 R1–R8 + 五段 + 两附);红线一:禁止用先验知识补分级;scoring.ranges 为空时不得出现任何分级名称或分数线;整篇不得套外层代码块 |
| ⑤ 同源闭环 | B07 加记录并给出入口 + D13/D15/D04/D30/D19 五处登记同名量表(措辞与 B07 逐字符一致);用户未要求接入报告 → 不动报告链路并在《更新说明》写明「未接入报告」 |
| ⑥ 过闸门 | 规范B「0. 铁律闸门」7 项 → 规范E §九 自检清单(15 条)→ 规范F §十三 自检清单(12 条)→ verify_pkg.py 全 OK → check_scale_docs.py 退出码 0 |
> ⚠️ scale/ 页不进 46 页编号体系:不占 B/D/F 编号、不单独出《产品功能清单》文档、不计入 A12-1 的页数统计;
> 但必须在《更新说明》里单列「新增量表页」(规范E §八)—— "不进编号"≠"可以不登记"。
Step 5 · 与用户确认更新范围与内容(最谨慎的一步)
> 前提:页面上的数组内容可能是用户已手工填过的真实业务数据。一旦覆盖不可恢复。
5.1 先问数据来源状态
- 当前包是「未改动的初版模板」还是「已经被人工改过 / 已填过真实数据」?
- 若是改过的:哪些页 / 哪些数据块是用户自己维护的? 需用户指明。
- 用户未指明前,不得假设。
5.2 分档确认更新范围(多选,逐条确认)
| 档 | 范围 | 风险 |
|---|---|---|
| 1 | 仅文案(占位符替换:医院/科室/医生/病种名/术式) | 低 |
| 2 | 文案 + 数据内容(数组内业务数据) | 中 — 可能覆盖用户已填数据 |
| 3 | 文案 + 数据 + 编码层标识符(类名/id/图标/模板代号) | 中 |
| 4 | 含新增页面 | 中 |
5.3 逐条列出将改动的内容
按规范A 输出待改动项总表:
| 页面 | 定位(变量/元素) | 当前值 | 将改为 | 档位 | 是否用户已填数据 |
|---|---|---|---|---|---|
让用户逐条或按档批量确认。
5.4 选择落地方式(必提,由用户定)
| 方式 | 做法 | 代价 |
|---|---|---|
| A 原位替换 | 直接改数组内的值 / 文案 | 简单直观;但会覆盖数据层,原有数据无法回填 |
| B 配置注入 | 把可变值抽到页面顶部 var CFG={...},渲染处引用 CFG |
不覆盖数据层、可回退;但需改渲染代码,属结构性改动,必须用户明确同意(T1 例外授权) |
> 不得默认采用 B;B 的改动范围超出 T1,须逐页取得用户明确授权。
5.5 必须给出的提示
- 备份:改动前对全包做一次整体备份到
<包目录>_bak_YYYYMMDD_HHMM(用户指定位置) - 回滚方案:
rm -rf <包目录> && cp -r <备份目录> <包目录>(必须在执行前与用户确认此命令可用) - 不可逆:一旦执行不可回滚(除非用备份还原)
- 分批:建议按档位或按端分批执行、每批校验
硬约束
- 用户明确确认前,不得执行任何写操作
- 用户未回答"数据来源"前,不得进行档位 2 及以上操作
- 涉及用户已填数据的改动,若用户未指明字段,不得假设,必须先问
输出:本次注入-更新范围确认单.md §5(档位 + 逐条清单 + 落地方式 + 备份与回滚方案),用户确认。
> 复核配置不再落盘:Step 7.0 按 §5 现场推导成临时配置(新值进 new_terms、被替换的旧值进 old_terms、易混用对进 pair_terms;有量化专病记录时补 specialty_record;分支 B 另补 debind 整块),跑完即删。
分支 B 的 Step 5 附加三项(缺一不得进入 Step 6):
| 附加项 | 内容 |
|---|---|
| 时间轴目标口径 | 入组第 N 天 / 治疗第 N 天 / 疗程第 N 天 —— 三选一,全包唯一,写进确认单 |
| 🟡 黄词逐处处置 | 取自确认单 §8.2(术语三色表),逐处给「保留 / 改写 / 删除」+ 理由 |
| 删除页同步清单 | 文件 / 全部入口链接 / 页面索引(+ 若有页数计数器),逐条列出 |
Step 6 · 执行
6.1 执行前差异盘点
对比源包与「初版模板」,确认是否存在未预期的既有改动;若有且用户未提及 → 停下报告,不得直接覆盖。
分支 A 的「初版模板」= skill 内置基线:
TPL="$HOME/.workbuddy/skills/病种注入器/assets/templates/通用型全病程服务包-V3.3"
diff -rq "$TPL" <源包目录> 2>&1 | grep -v '\.DS_Store'
- 无输出 → 源包是未改动的初版模板,正常进入 6.2
- 有差异 → 逐页判定「用户既有改动」vs「模板基线差异」,结论写进台账;涉及用户未提及的改动一律先停下问
> ⚠️ 源包来自模板本身(用户未带源包)时:6.1 免做差异盘点(复制件与基线必然一致),但仍要跑 detect_source_pkg.py 留证。
> ⚠️ 分支 B 不适用本条:专属包没有对应基线,改由 Step B1–B3 的资产清单与残留矩阵承担。
6.2 注入替换:严格按 references/规范A-病种注入执行清单-V2.md 执行,顺序:
第 0 步 全局 → 第 1 步 B 端 14 页 → 第 2 步 D 端 21 页 → 第 2.5 步 F 管理端 11 页 → 第 3 步 编码层 → 第 4 步 核验(不含 A01 段)
> 分支 B 的顺序不同:以"页"为单位,逐页执行 解绑 → 注入(同一页内成对完成),严格按 Step B4 处置清单走。
> 禁止"先全包解绑、再全包注入"的两遍走法 —— 两遍必然产生「目标病种名 × 前序病种概念」的中间态残留(见 T1-b 与 A9-3)。
> 镜像对必须同批处理:识别出的 B 端 ↔ D 端镜像页,在同一批里改完,不得先改一端。
6.3 新增页面:⚠️ 前置条件是 Step 4.2 闸门已过(且新增动议由用户提出 —— AI 不主动建议新增页)(需求卡已由用户回复「正确」)—— 未过闸门不得新建任何页面。执行时严格按 references/规范B-新建页面规范-V2-医患两端.md 走(同 4.2.5),逐项过其自检清单(含「0. 铁律闸门」7 项;含 §十一 E / H 的「历史卡片行序 + 时间行文案」强制项,对照 §3.3.2 —— 历史卡片标准适用于任何新建的含历史数据页面,不是 B03 的个案)
6.4 每次改动
- 先备份到临时目录
- 大块删除用「行区间 + 首末行断言 + 上下行越界断言 + 自底向上」
- 改完与备份跑
difflib,确认「删的行都在预期清单内、加的行只有预期的补位行」
6.5 交付前跑校验
python3 scripts/verify_pkg.py <服务包目录>
校验项:内联脚本语法 / 真实 DOM div 配平 / 失效链接(原「页面计数一致性」已随 A01 删除而移除)。
> ⚠️ 两脚本必须能真正跑完:review_pkg.py 曾因逐词逐文件直接读盘(53 页 × 50 词 ≈ 2600 次)被拖到超时甚至 SIGKILL —— 全部改走读盘缓存后完整复核约 4 秒。跑不完的校验等于没有校验。
分支 B 追加(解绑是否真的做干净,机器先过一遍):
python3 scripts/scan_residue.py <服务包目录> --terms <临时目录>/术语三色表.txt # 临时入参(结论进确认单 §8.3)
python3 scripts/review_pkg.py <服务包目录> --config <临时目录>/复核配置.json # 临时配置,跑完即删
6.6 产出待复核件(本步不交付)
- 不写任何记忆
- 不新出文件:改动清单(改了哪些页 / 哪些块 / 多少处)+ 遗留待确认项在对话里呈现,并由 Step 6.7 落进包内《更新说明》
- 确认单 §7 填上「文档产出范围」;状态记在对话里(「执行完成 · 待复核」)
6.7 ★ 文档产出(成套交付的甲层 · 按需产出 · 不可跳过)
> 依据 规范D。页面改完先判断本次哪些页需要文档,再产出;不要等复核发现缺陷再补。
> ★ 2026-10-10 用户裁定:文档不再逐页产出 —— 只在两种情况下产出,其余一律不产出。
6.7.1 ★ 先判「本次哪些页要文档」(只有两种情况)
| # | 情况 | 判据(只认结构变化) | 动作 |
|---|---|---|---|
| ① | 新增页面 | 本次交付中新加入的页面 | 必须新写 {编号}-{页名}-A.md,版本 A |
| ② | 结构级大改的已有页面 | 该页出现 —— 分区增删(新增 / 删除一个分区)或 骨架顺序变化(分区先后次序改变),二者之一 | 整篇重写该页文档(八节);版本升一版(A → A2 …) |
以下改动一律不产出文档:改演示数据 / 数值 / 文案、改样式(颜色 / 字号 / 圆角 / 间距 / 图标)、功能点增删(分区与骨架未变)、出链入链少量增删、资产替换、逻辑与阈值调整、类名重构。
- ⚠️ 判据只有两条(「分区增删」「骨架顺序变化」)。不得把「改动很大」「涉及多页」「功能点 37→39」这类主观或量化感受当成结构级大改。
- ⚠️ 边界情形(拿不准是否构成分区增删 / 骨架重排)→ 按「不算」处理,并当场问用户,不得自行升级为「要重写文档」。
- 判定结果(新增页清单 + 结构级大改页清单)在对话里列出,并写进确认单 §7。
6.7.2 明确不做的事(★ 2026-10-10 起)
| 不做 | 说明 |
|---|---|
| 不做全量生成 | 源包无 产品功能清单/(首轮从内置模板起)→ 不生成。包内初始无文档即为正常状态 |
| 不做基线复制 / 平移 / 比对 | 取消「把源包基线复制到临时目录再逐页比对」整套动作;不再产出 SAME/DIFF/MISSING/EXTRA。scripts/doc_baseline_diff.py 已删除(机制取消,脚本不在包内) |
| 不做删除页声明 | 页面被删:不加作废声明、不改版本、不在《更新说明》单列;其文档原样留在包内即可 |
| 不要求「页数 = 文档数」 | 该等式作废。文档数 = 新增页数 + 结构大改页数(可以是 0) |
| 不做邻页跟随 | 新增 / 删除页面不再要求同步邻页 §四 —— 除非该邻页自己也命中 ② |
6.7.3 按判断产出文档
| 步 | 做什么 | 产出 |
|---|---|---|
| a | 在 <包目录>/产品功能清单/ 下建立或复用文档目录 |
目录 |
| b 新增页 | 读源码 → 按八节骨架写文档(事实来源只有页面源码,不读记忆);「产出事由」写「新增页」 | {编号}-{页名}-A.md(版本 A) |
| c 结构大改页 | 读源码 → 整篇重写该页文档;「文档版本」升一版、「修订日期」改本次、「产出事由」写具体结构变化 | 重写后的 md |
| d 其余页 | 不动 —— 不重写、不升版、不改日期、不补文档 | 无 |
| e《更新说明》 | 写 更新说明-YYYYMMDD.md,含「页面 ↔ 文档」对照表 + 本次文档产出小结(0 份时必须写明「本次无新增页、无结构级大改,未产出文档」) |
更新说明 |
| f 校验 | 跑 python3 scripts/check_docs.py "<包目录>/产品功能清单" → FAIL 项必须为 0(无文档目录时视为不适用) |
校验输出 |
| g 写配置 | 把 docs 块写进临时复核配置(dir / min_lines / update_note / required_pages / skip_pages)—— 临时文件,属 Step 7.0,复核跑完即删 |
配置 |
> ⚠️ required_pages 必须显式给出 —— 它 = 本次新增页 + 结构级大改页的清单(本次确实没有就写 [])。
> 键缺失时 A12 只报 WARN(「没声明」与「声明为空」是两回事),交付时必须已显式声明。
硬约束
- ⚠️ 文档一律占位符化:即使包内页面已填真实医院 / 病种 / 医生名,文档里也写
⟨医院⟩/⟨病种名⟩/⟨主诊医生⟩(规范D §二 绝对禁令 1) - ⚠️ 不改任何
.html:本步只产出 md - ⚠️ 不产出文档是常态,不是缺失:包内文档数 < 页面数属正常状态,不得据此判「不成套」、也不得「顺手补齐」
- ⚠️ 不得把「改动大」当「结构大改」:越线产出文档同样是违规(用户要求「非必要不生成」)
- ⚠️ 新增页必须产出文档:这条是硬要求,不得以「非必要不生成」为由省掉
- ⚠️ 声明了就必须有(
required_pages):A12-1 会逐项核对;声明漏了则机器查不出(见 A12 明细「已知局限」),靠《更新说明》对照表 + 确认单 §7 + 交付前自检三处互证 -
⚠️ 不做基线复制平移:不得把源包基线整目录复制出来比对(那正是本轮要消除的动作)
-
状态记在对话里(「执行完成 · 文档已按需产出 · 待复核」)
- → 进入 Step 7 复核;复核通过后才交付
Step 7 · 交付前强制复核与根因追查(不通过不得交付)
> 复核不是"再检查一下",是交付闸门。原则:可取证、全覆盖、就地修复、追到根因。
> 用户硬要求:同一个错误不得多次犯 —— 因此本步必须产出「防复发措施」并回写。
7.0 准备复核配置(临时文件 · 不落输出目录)
按确认单 §5 / §7 生成临时复核配置(写系统临时目录;复核跑完即删,不得落在用户输出目录):
{
"old_terms": ["被替换掉的旧值1", "旧值2"],
"new_terms": ["新病种值1", "新病种值2"],
"pair_terms": [["术后第", "入组第"]],
"allow": {"某通用词": ["允许保留该词的文件名.html"]},
"expect_pages": 50,
"docs": {
"dir": "产品功能清单",
"min_lines": 350,
"update_note": "更新说明-20261010.md",
"required_pages": ["本次新增页.html", "本次结构大改页.html"],
"skip_pages": []
},
"specialty_record": {"name": "眼轴", "patient_page": "B16-XX打卡-患者端.html",
"overview_page": "D04-患者全景视图-中心医护端.html",
"doctor_pages": ["D31-XX上报处理-中心医护端.html"]},
"hist_icon": {"extra": {}, "exempt_classes": [], "exempt_pages": []},
"debind": {
"prior_terms": ["前序病种全量术语(🟢 + 🟡,取自 Step B2 三色表)"],
"target_terms": ["目标病种名与其同源词"],
"conflict_pairs": [["目标病种名", "前序病种概念词"]],
"timeline_terms": ["术后第", "手术日", "术前"],
"dict_keys": ["前序病种专属字典键"],
"mirror_pairs": [["B端页.html", "D端页.html"]],
"allow_comment": {"某词": ["允许保留该词的文件名.html"]}
}
}
| 字段 | 含义 | 判定 |
|---|---|---|
old_terms |
本次被替换掉的旧值 | 全包应为 0 命中 |
new_terms |
本次注入的新值 | 全包应 ≥1 命中(防「漏改」) |
pair_terms |
容易混用的旧/新对 | 同一文件内不得同时出现 |
allow |
允许保留的例外(词 → 文件名或 *) |
例外必须写进确认单 §5 的「例外登记 / 已知接受项」 |
expect_pages |
期望页数 | 与实测一致(新增页后必须同步 +1,见 规范B §9.2 第三处) |
specialty_record |
量化专病记录(指标词 + 患者端打卡页 + 全景视图 + 处理页) | 驱动 A7-4(结构)/ A7-4b(趋势卡只在单患者上下文渲染)/ A7-4c(同源);配置即查,未配置则跳过 |
docs(★ 交付硬要求) |
文档产出配置(文档目录 / 篇幅下限 / 更新说明文件名 / 本次需文档的页清单 required_pages / 无需文档的页) |
驱动 A12 组(声明的需文档页 ↔ 文档存在性、八节 / 篇幅 / 版本日期 /《更新说明》);未配置则整组跳过并告警 —— 交付前必须配置(规范D §七) |
hist_icon |
历史卡片统一骨架(新页图标类名 → 四项规格 / 骨架属性覆盖 / 旧类名清单 / 例外类名 / 例外页) | 驱动 A14 组五条;不配则用内置基线(五页一套 .his-*,规范B §3.3.3);仅新增含历史数据的页时才需要填 extra/old_classes(改骨架数值须先改 §3.3.3 表再配 card_extra) |
debind(分支 B 专用) |
解绑复核配置,驱动 A9 组 | 配置即查,未配置则整组跳过 |
> ⚠️ debind 只由分支 B 填。分支 A 留空 → A9 组整体跳过,不影响既有 0 FAIL / 0 WARN 基线。
> debind 的字段口径见 规范C §10.1。
7.1 四层复核(每层都要有输出,缺一层视为未复核)
| 层 | 查什么 | 手段 | 通过标准 |
|---|---|---|---|
| L1 机械层 | 页面能不能跑 | python3 scripts/verify_pkg.py <包目录> |
语法 / div 配平 / 失效链接 全 OK |
| L2 需求层 | Step 5 确认单里的每一条,做没做 | 逐条对照确认单 + 关键词命中/截图 | 每条都有证据,无「未复核」 |
| L3 规范层 | 规范A 清单项是否落实;另查编码层(第 3 步)是否清干净 | python3 scripts/review_pkg.py <包目录> --config <配置> + 与备份 difflib |
A 组 0 FAIL;diff 无越界改动 |
| L4 一致性层 | 跨页同源数据是否同步 | review_pkg.py 的 A4 组(B04↔D26 逐字符 / 六处量表库 / 报告 id 链路 / 宣教同源 / 症状通道)+ 无头实测 |
0 FAIL |
| L5 文档层 ★ | 成套交付的甲层(按需产出):声明的需文档页 ↔ 文档存在性、八节齐全、篇幅、版本与日期、《更新说明》 | python3 scripts/check_docs.py "<包目录>/产品功能清单" + review_pkg.py A12 组 |
check_docs.py FAIL 0;A12 组 0 FAIL(required_pages 必须已显式声明) |
review_pkg.py 的分组含义:
| 组 | 内容 | 级别 |
|---|---|---|
| A1 | 真实姓名(已知名单 + 患者对象姓名非「患者NN」) | FAIL |
| A2 | 糖尿病 / 慢病底版残留(SDSCA/DKT/FootRisk/HypoRisk/ADDQoL/ESDQOL/DQOL/hba1cValues/FOOT/fa-shoe-prints/dm htn exp ctl) |
FAIL |
| A3 | 肛肠 / 痔病底版残留(吻合器/截石位/3、7、11/凡士林/PPH/Wexner/控便/莫匹罗星/地尔硫卓/硝酸甘油/腰硬联合麻醉/扩肛/里急后重) |
FAIL |
| A4 | 跨页一致性 6 组(数据同源) | FAIL / WARN |
| A5 | 页数(按配置) | FAIL |
| A6 | 患者端 UI 一致性 11 条(对照 规范B §2.4 十四条硬规则 + §5.3 打卡区排序)—— 见图下明细 | FAIL / WARN |
| A7 | 医生端 UI 一致性 5 条(对照 规范B §1.4 D-1~D-9)—— 见下明细 | FAIL / WARN |
| A8 | D 端底部导航 + 全局预警徽章 4 条(对照 规范B §1.4 D-7 / D-8)—— 见下明细 | FAIL |
| A9 | 源包解绑 6 条(分支 B 专用,debind 配置驱动)—— 对照 规范C §10 —— 见下明细 |
FAIL / WARN |
| A10 | 时间基准 3 条—— 页面「今天」必须随系统日期,不得写死(对照 规范B §5.4)—— 见下明细 | FAIL |
| A11 | 用药打卡粒度 3 条—— 全病种一律按周,硬性不得改为按日 / 按月(对照 规范B §5.1)—— 见下明细 | FAIL |
| A12 | 文档产出 6 条 ★—— 声明的需文档页 ↔ 文档存在性、八节、篇幅、版本与日期、《更新说明》(对照 规范D,docs 配置驱动)—— 见下明细 |
FAIL / WARN |
| A13 | 图标一律 FontAwesome 3 条—— ① 不得用 emoji 充当图标(静态图标位 / 裸 emoji 字面量)② ★ 图标名必须在 FA Free 里真的存在(防 FA Pro 专属图标渲染成空白),覆盖三端 B·D·F(对照 规范B §0.5)—— 见下明细 | FAIL |
| A15 | F11 Excel 生成量表入口禁令 2 条 ★(★ 2026-10-11 新增)—— 静态 DOM 不得出现「导入题目 / 从Excel导入题目 / 下载模板 / 导入量表」入口与 <input type="file" accept=".xlsx,.xls">;不得再引外部 xlsx 库(对照 Step 4.7.4)—— 见下明细 |
FAIL |
| A14 | 历史卡片「统一骨架」5 条 ★—— 图标规格漂移 / 旧形态回归 / 未登记同类新类 / 卡片骨架规格漂移 / 旧类名残留(对照 规范B §3.3.3,真源同节)—— 见下明细 | FAIL / WARN |
| B1/B2/B3 | 旧值残留 / 新值缺失 / 新旧混用(按配置) | FAIL |
| C1 | CDN 图标库(离线不可用) | WARN |
A6 组明细(2026-10-01 新增 · 用户患者端反馈的机器化;A6-7~9 为同日二次反馈补入)
| 编号 | 判定 | 级别 | 对应规则 |
|---|---|---|---|
| A6-1 | 二级页标题栏含非空 .subtitle |
FAIL | B-1 标题栏不写副标题 |
| A6-2 | 标题栏含计数说明容器 .h-note |
FAIL | B-2 计数不进标题栏,改挂 tab 徽章(B10/B14 逐页豁免,见 A6-9) |
| A6-3 | 历史记录区块文案 ≠ 历史数据 |
FAIL | B-4 历史区块文案全包唯一 |
| A6-4 | 历史记录区块图标 ≠ fa-solid fa-clock-rotate-left(含内联配色覆盖) |
FAIL | B-3 / B-5 |
| A6-5 | 二级页 .header / .page-header 背景不含 #004F8A / var(--deep) |
FAIL | B-6 标题栏背景全包唯一 |
| A6-6 | B01 铃铛角标未与 B13 待办数量联动(notice_todo_count) |
WARN | B-9 角标口径 |
| A6-7 | .header padding ≠ 14px 16px,或 .btn-back ≠ 34×34(B03 豁免) |
FAIL | B-11 标题栏高度全包唯一 = 62px |
| A6-8 | .btn-back 内图标为 fa-arrow-left |
FAIL | B-12 返回图标全包唯一 = fa-chevron-left |
| A6-9 | .header 直接子元素超出白名单 {.btn-back, .title} + 逐页豁免的右上角清单级功能位(B06 .h-mg / B10·B14 .h-note / B13 .read-all) |
FAIL | B-1 / B-13 标题栏只承载「返回 + 标题」 |
| A6-10 | 深色标题栏(含 #004F8A / var(--deep))上标题字或返回按钮字非白色;或浅色标题栏上标题字为白色 |
FAIL | B-14 标题栏文字颜色须与背景明暗匹配(改背景必须同步改字色) |
| A6-11 | 健康日记打卡区排序:含「通用项白名单」(DIARY_COMMON_TERMS = 运动 / 睡眠 / 体重 / 饮食 / 情绪 / 饮水,可配置)的 .diary-card,其后出现不含白名单词的卡 |
FAIL | 规范B §5.3「打卡区排序规则」 —— 病种专属项在前、通用项在后;新增专属项插到最顶(2026-10-07 用户裁定) |
> B-7 空态文案、B-8 左对齐、B-10 品牌重复 属语义判断,仍为人工验收项(规范B §2.4)。
> A6-7 ~ A6-9 的反向自测:对未注入基线运行 → 报 29 条 FAIL(含 4 种标题栏高度、5 页图标混用、read-all / h-note / tt-wrap 越界),可完整复现用户两轮反馈的全部问题。
>
> A6-2 / A6-9 的豁免机制(2026-10-07 立):两表共用 HDR_CHILD_ALLOW_EXTRA 一份依据 —— 同一个 .h-note 被两条校验同时覆盖,若只豁免其一会出现「A6-9 放行、A6-2 仍报」的自相矛盾。当前豁免 4 处右上角清单级功能位(B06 .h-mg / B10·B14 .h-note / B13 .read-all),每处均在该表内写明理由;业务功能入口不得豁免。
>
> 同轮按 B-1 / B-13 清理模板:B05/B06/B07/B08/B09 的 .tt-wrap / <div style="flex:1"> 包装层全部移除(.title 直接作子元素并补 flex:1),B05 副标题一并删除 → A6 28 → 17 条。
> A6-10 反向自测:对「标题栏背景已统一为深蓝、但字色未同步」的中间态快照运行 → 报 4 条 FAIL(B12/B13/B14/B15,逐页指出标题字色 var(--text) 与按钮字色 var(--primary) 应为白色);对已修复包 → 0 FAIL;对既有眼科 / 肛肠两个交付包 → 0 FAIL(0 误报)。
> A6-11 正反向自测(2026-10-07,6/6 全过):① 正向对未注入模板 → 0 FAIL;② 把通用项卡换到专属项卡之前 → 抓到;③ 在通用项卡之后再插新专属项卡(违反「插到最顶」)→ 抓到;④ 新专属项卡插到最顶(合规)→ 0 FAIL;⑤ 通用项词被整体替换(无法判定)→ 跳过不误报;⑥ 专属项卡标题含「运动」字样但顺序正确 → 0 FAIL(fails open,不误杀)。
> A6-11 判据为什么用白名单:专属项随病种变化、无法枚举;通用项是跨病种固定的一组 —— 枚举它才是低误报的可行判据。代价是「专属项卡恰好含通用项词」时放弃判定,宁可漏报、不可误杀。
A7 组明细(2026-10-01 新增 · 用户中心医护端四项反馈的机器化)
| 编号 | 判定 | 级别 | 对应规则 |
|---|---|---|---|
| A7-1 | 一级页(D01/D02/D29).header 内无 header-ico |
FAIL | D-1 标题栏「图标 + 名称」成对(D03/D21 属已登记偏差,不在范围内) |
| A7-2 | 主宫格 #funcGrid 混入 fc-b,或展开区 #funcExpand 出现 fc-a;主宫格无 fc-a |
FAIL | D-2 类别配色(业务蓝 / 管理紫)/ D-3 蓝前紫后 |
| A7-3 | D30 缺 .im-tt 或 .t1/.t2 结构;.t2 仍为占位 — |
FAIL | D-4 会话头部两行(身份 / 诊断);第一行未按「姓名 · 性别 · 年龄」拼接 → WARN |
| A7-3b | .t1 内缺 .nm / .sub;或二者未显式声明 font-size/font-weight;或二者字号相同、粗细相同 |
FAIL | D-4 第一行内层级:姓名重、性别年龄轻(赋值允许 textContent / innerHTML 两种写法) |
| A7-4 | 量化专病页缺 <div class="trend-wrap"> / 趋势卡内无 KPI / 「最新上报数据」卡内仍含该指标词 / 两页 KPI 不同源 |
FAIL | D-5 独立成趋势卡 / D-6 同源(配置 specialty_record 驱动,未配置则跳过) |
| A7-4b | 趋势卡的显示上下文(处理页):① 静态 DOM 中出现趋势卡元素(未被 ?name= 条件控制);② 缺「按 ?name=/PT 动态渲染趋势卡」的证据(无趋势卡模板串 / 无生成函数 / 生成语句不在 if(!PT)return; 之后);③ 趋势卡模板里 KPI 写成字面量而非变量拼接(换患者不跟着变);④ 处理页出现指向自身的「上报处理 →」入口 |
FAIL | D-5 上下文条款(趋势卡是单患者维度组件,全患者清单一律不得渲染) |
| A7-5 | 医生端标题栏同上(深色底字色非白 / 浅色底字色为白) | FAIL | D-9 同 B-14(与 A6-10 共用 _header_contrast()) |
> A7 组反向自测:对交付包副本构造 8 处缺陷(删 header-ico、fc-a→fc-b、.t2 改占位、删趋势卡、把指标词塞回「最新上报数据」、KPI 改一位数、把趋势卡写成静态 DOM、趋势卡 KPI 写字面量)→ 全部被抓(8/8);对已修复包正向跑 → 0 FAIL。
> A6 / A7 必须成对维护:此后凡新增一端的一致性规则,另一端同步评估是否有对称项 —— 避开「校验只长在被反馈过的那一端」的重复偏差(坑清单 R4-7)。
> ⚠️ 判定用「HTML 元素」而非「字符串存在」:A7-4 查趋势卡时须匹配 <div class="trend-wrap">,否则会被 CSS 里的 .trend-wrap{…} 规则误判为"已存在"(首版实测踩到)。
> ⚠️ A7-4b 反过来也要区分「静态元素」与「JS 模板串」:处理页的 '<div class="trend-wrap">'(带前导引号)是合法的动态模板,<div class="trend-wrap">(裸标签)出现在 HTML 区才是 FAIL —— 前者恰恰是正确做法(2026-10-05 D31 反馈固化)。
> ⚠️ A7-4b 的判据来源:趋势卡属单患者维度组件,而处理页默认态是全患者清单 —— 判错上下文会让"某个患者的曲线"冒充"这一屏的汇总",比不显示更误导(规范B §1.4 D-5 判定句式)。
A8 组明细(2026-10-01 新增 · 用户「D21 底栏高度不一致 / 各页预警徽标数值不一致」反馈的机器化;同日晚扩充 A8-1b「视觉口径」)
| 编号 | 判定 | 级别 | 对应规则 |
|---|---|---|---|
| A8-1 | 带底栏的 D 页:.bottom-nav 写死 height / 缺 padding:6px 0;或 .nav-item 缺 padding:4px 0 / 字号非 10px |
FAIL | D-7 底栏尺寸口径统一(不设 height,自然高 50px) |
| A8-1b | 带底栏的 D 页视觉口径跨页比对:NAV_VISUAL_SPEC 规格表(4 选择器 × 25 项)逐项同值 —— 文字色 var(--tl)(禁硬编码)/ 上边框 var(--border) / 下圆角 / z-index / 选中态不得出现 font-weight / 徽章定位与 15px/15px/15px 与 font-weight:700;任一页缺项或缺值也 FAIL |
FAIL | D-7 底栏视觉口径统一(按维度把关,不等用户逐条指出) |
| A8-2 | 带底栏的 D 页缺 .nav-badge;或各页徽标数值不一致 |
FAIL | D-8 徽标齐备 + 全站同值 |
| A8-3 | D02 徽标 ≠ 其 WARNS 中 !handled 条数 |
FAIL | D-8 徽标真值 = 预警列表「未处理」条数(识别不到 WARNS 命名时降级 INFO) |
> A8 组反向自测:构造 6 类缺陷(导航条写死 height:62px、导航项 padding 回退 6px 0、导航项字号回退 11px、某页徽标改 5、删 D29 徽章、D02 徽标改 9)→ 6/6 全被抓;正向跑交付包 → 0 FAIL、INFO 报出「徽标全站一致:4(覆盖 D01、D02、D03、D21、D29)」+「= D02 未处理真值 4」。
> A8-1b 反向自测:构造 8 类缺陷(D21 文字色回退硬编码 #8aa3bc、D21 选中态加回 font-weight:600、D02 徽章回退 16px、D03 底栏 z-index 回退 100、D21 去掉下圆角、D29 徽章去 font-weight:700、D21 上边框回退硬编码、D03 .nav-item 缺 gap)→ 8/8 全被抓;正向跑交付包 → 0 FAIL、INFO「底栏视觉口径全站一致:25 项 × 5 页」。
> ⚠️ 自测脚本必须清 _CACHE:read_cached 是模块级缓存,反复改写同一路径的副本包时会命中旧内容,导致「规则明明生效却显示漏检」—— 每次 run() 前 _CACHE.clear()(首版自测踩到,8 例全假阴性)。
> A7-3b 反向自测:删 .sub 载体、把 .sub 字号改回 16px、粗细改回 700 → 3/3 全被抓。
A9 组明细(2026-10-03 新增 · 用户《逐页未完全修改审计》的机器化 · debind 配置驱动 · 分支 B 专用)
> 立组依据:审计在专属包上跑完 skill 后,60+ 页仍留有前序病种语义,而当时所有机器校验全绿 —— 因为 B1 组只查"旧值残留",而旧值(病种名)确实已经 0 命中了,残留的是没被列入旧值的那些词、以及旧概念与新病种名的共现。这是校验维度缺失,不是执行失误。
| 编号 | 判定 | 级别 | 对应 规范C 验收项 |
|---|---|---|---|
| A9-0 | prior_terms(🟢+🟡 全量)在全包命中 |
FAIL | C-1 前序病种术语清零 |
| A9-1 | 文件头注释(<!-- -->)内含 prior_terms(allow_comment 例外除外) |
FAIL | C-2 ← 审计最高频载体 |
| A9-2 | 同一文件内同时出现 target_terms 与 timeline_terms(时间轴口径未迁移) |
FAIL | C-3 |
| A9-3 | conflict_pairs 任一对在同一文件共现(=「目标病种名 × 前序病种概念」,如「慢性胃炎术后需要扩肛」) |
FAIL | C-7 ← 审计核心病 |
| A9-4 | 镜像对未同步:mirror_pairs 中两端文件对同一 prior_terms 的命中集合不一致(一端 0 一端 >0) |
FAIL | C-5 ← 审计整批镜像页落下 |
| A9-5 | dict_keys(前序病种专属字典键)在全包命中 |
FAIL | C-8 |
| A9-6 | debind 未配置 |
INFO(整组跳过,不报错) | — |
> 为什么 A9-3 必须独立成条:pair_terms 查的是「旧值 ↔ 新值」共存,而这里的问题是「新值 ↔ 旧概念」共存 —— 旧值已经改没了,old_terms / pair_terms 都抓不到。审计里 慢性胃炎术后需要扩肛 这类串就是这么漏过去的。
> 为什么 A9-4 用"命中集合比对"而不是"逐字段比对":镜像两页的数据结构命名可能不同(B07 vs D18),逐字段比对会大面积误报;而"两端对同一批前序病种词的命中情况应当一致"是一条充分且低误报的代理判据 —— 一端清干净了另一端没清,一定命中不一致。
> A9 与 A3 的分工:A3(肛肠 / 痔病底版残留)是分支 A 专用的固定词表,不因分支 B 而扩充 —— 对某些目标病种(如肛肠科内换病种),创面 / 切口 / 术后 本身就是合法词,硬塞进固定词表会造成大面积误报。分支 B 一律走 A9 的配置驱动路径。
A10 组明细(2026-10-07 新增 · 用户「页面显示的今天都是 8 月 29 日」反馈的机器化 · 对照 规范B §5.4)
> 立组依据:模板以 2026-08-29 为「今天」编排全部演示数据,日期硬编码 → 页面永远显示 8 月 29 日。
> 改造方案 = 随包分发 assets/js/timeshift.js,页面加载时把数据按 今天 − 基准日 实时平移。
| 编号 | 判定 | 级别 | 对应规则 |
|---|---|---|---|
| A10-1 | 页面未引入 assets/js/timeshift.js |
FAIL | T-1 页面「今天」会停在数据基准日 |
| A10-2 | <script> 区内有未被 TS() / TS_RANGE() 包裹的完整日期字面量(注释除外) |
FAIL | T-1 日期字面量必须经 TS() |
| A10-3 | 仍写死「今天」锚点:new Date(20xx, m, d) / return '20xx-xx-xx…' / TODAY_STR = '20xx-…' |
FAIL | T-3 演示时钟须由 TS_TODAY() 派生 |
> A10 反向自测(2026-10-07,5/5 全过):① 正向对已转换模板 → 0 FAIL;② 删掉 timeshift.js 引入 → 抓到;③ 把一个日期还原成裸字面量 → 抓到;④ 恢复写死的 nowStamp() → 抓到(A10-2 与 A10-3 双报,同一缺陷的两面,属预期);⑤ 日期只出现在注释里 → 0 FAIL(不误报)。
> ⚠️ A10-2 的判定要用「剥掉 TS 调用后再找日期」:否则 TS('2026-08-29') 里的日期会被当成"未包裹"而全包误报。
> ⚠️ 注释里的日期必须放行:/* 数据基准日 2026-08-29 */ 是说明,不是显示值。
> ⚠️ TS() 的短格式守卫:10-14 天 / 10-15分钟 / 30-60% / 第 3-5 周 是范围量不是日期;但 09-02 周三 是日期 + 星期必须平移 —— 守卫要能同时满足这两侧(见 timeshift.js 内注释)。
A11 组明细(2026-10-07 新增 · 用户「用药打卡默认全部按周执行、不询问」裁定的机器化 · 对照 规范B §5.1)
> 立组依据:改造前的规则把「粒度」做成 Step 2 的待选项(日报 / 周报 / 月报),但 规范A 的 B06 / D12 执行清单里没有粒度项、review_pkg.py 也无对应校验 —— 决定接不住,会产出「日报粒度 × 周控件 ×「本周用药频率」文案」的自相矛盾页面。
> 现改为硬性按周:不再有需要承接的选择,同时用本组拦住"后人无意改回日/月口径"。
| 编号 | 判定 | 级别 | 对应规则 |
|---|---|---|---|
| A11-1 | 用药打卡患者端页(默认按前缀 B06- 识别,可用 cfg.med_page 覆盖)未含 .week-picker |
FAIL | §5.1 周粒度控件缺失 |
| A11-2 | 该页出现 .time-picker / .day-picker / .month-picker |
FAIL | §5.1 被改成按日 / 按月 |
| A11-3 | 其他页出现 .day-picker / .month-picker |
FAIL | §5.1 全包不得存在非周粒度控件 |
> A11 正反向自测(2026-10-07,6/6 全过):① 正向对模板 → 0 FAIL;② 删掉 B06 的 week-picker → 抓到 A11-1;③ .week-picker 换成 .time-picker → 抓到 A11-2;④ B06 加 .day-picker → 抓到 1 条(载体页不双报);⑤ 其他页 B04 加 .month-picker → 抓到 A11-3;⑥ B06 同时缺 week-picker 且含 .day-picker → 双报 2 条(同一缺陷两面,属预期)。
> ⚠️ 载体页判定用「前缀 + 可配置覆盖」,不写死文件名:cfg.med_page 优先,否则取 B06-*.html —— 与 A11-3 的分工靠"载体页跳过"避免同因双报。
> ⚠️ .time-picker 只在该页禁:B03-症状上报 的日期选择器就是 .time-picker,全包禁它会大面积误报。
A12 组明细(2026-10-08 立组 · ★ 2026-10-10 按用户裁定整体收窄 · docs 配置驱动)
> 立组理由不变:T3 交付物原先只有「这次改了什么」,没有一份「这页是什么」。
> 2026-10-10 的口径变化:文档不再逐页产出 —— 只在 ① 新增页 与 ② 结构级大改页(分区增删 / 骨架顺序变化)两种情况产出。据此 A12 组改为围绕「本次声明的需文档页清单」校验。
| 编号 | 判定 | 级别 | 对应 规范D |
|---|---|---|---|
| A12-1 | 声明的需文档页 → 文档必须存在:docs.required_pages 里的任一页缺 {去 .html}-A.md |
FAIL | §二「什么时候产出文档」 |
| A12-1b | 文档目录缺失(required_pages 非空时)→ FAIL;声明页在包内查不到对应 html → WARN |
FAIL / WARN | §二 |
| A12-2 | 无对应页面的文档(多为页面已删除 / 改名)—— 新规则「删除页不用声明」,原样留档即合规 | INFO(原为 FAIL) | §7.2 |
| A12-3 | 《更新说明》:文件不存在 / 行数 < 20 / 缺「页面 ↔ 文档」对照表表头 | FAIL | §八 |
| A12-4 | 八节齐全:文档缺任一节名(逐字比)。「九、变更记录」已取消 | FAIL | §三 |
| A12-5 | 篇幅:文档行数 < docs.min_lines(默认 350) |
FAIL | §二 |
| A12-6 | 版本与日期:缺「文档版本」行,或缺「生成日期」/「修订日期」行 | FAIL | §二 / §7.4 |
| A12-skip | docs 未配置 |
WARN(整组跳过) | — |
| A12-req | docs.required_pages 键缺失(未做「本次哪些页要文档」这一判断) |
WARN | §七 |
> ⚠️ required_pages 必须显式声明(本次确实没有就写 []):「没声明」与「声明为空」是两回事 —— 前者是执行者漏做了这次判断(报 WARN),后者是「本次确无新增 / 无结构大改」(合法)。
> ⚠️ A12-1 已不再是「每页一份」:「页数 = 文档数」作废。包内文档数 < 页面数是正常状态,不得据此判交付不成套。
> ⚠️ A12 的已知局限(如实声明):required_pages 是执行时自声明的清单 —— 机器能保证「声明了却没写文档」必被抓(A12-1),做不到「该声明却没声明」(机器无从知道哪页是本次新增 / 结构大改的)。后半段靠人工:《更新说明》对照表 + 确认单 §7 + 交付前自检第一条,三处互证。
> ⚠️ 为什么 docs 未配置只报 WARN 而不是 FAIL:机器不能替人判断「这次是不是一次正式交付」——模板基线跑、中途试探跑都不该被文档缺失判死。但文档产出是交付硬要求,所以未配置时必须报 WARN,且在 Step 7.7 交付判定里作为人工必查项(配置了 docs 就必须 A12 组 0 FAIL)。不得把 docs 留空当成「跳过校验」的手段。
> ⚠️ A12 只管「有没有 / 齐不齐 / 对不对形」,不管「写得准不准」 —— 内容准确性由 check_docs.py(C1~C10:命名 / 八节 / 功能点连续 / 篇幅 / 模拟数据 / 占位符 / 小节 / 待收口项要素)与 L2 需求层的人工取证承担。两个脚本都要跑,不能互相替代。
> ⚠️ A6 / A7 / A8 / A9 / A10 / A11 / A12 / A13 / A14 的成对维护约定照旧:凡新增一类交付面,同步评估是否需要在别处加对称项。
> A12 正反向自测(★ 2026-10-10 收窄版重跑 · 15/15 全过):① 无目录 + required_pages=[] → 0 FAIL;② 无目录 + 声明非空 → A12-1 目录缺失 FAIL;③ 未声明 required_pages → WARN;④ 声明 2 页且都有文档 → 0 FAIL;⑤ 声明 3 页缺 2 份 → A12-1 FAIL;⑥ 声明页不在包内 → WARN;⑦ 孤儿文档 → INFO(不再 FAIL);⑧ 缺「八、验收自检清单」→ A12-4 FAIL;⑨ 文档含多余「九、变更记录」→ 不报;⑩ 文档 120 行 → A12-5 FAIL;⑪ 缺版本 + 缺日期 → A12-6 FAIL ×2;⑫ 更新说明无对照表 → A12-3 FAIL;⑬ 有对照表但无「版本」字样 → 不 FAIL(新口径已去掉该要求);⑭ 更新说明过简 → A12-3 FAIL;⑮ 目录空 + required_pages=[] → 0 FAIL。
> 零回归:skill 内置模板包跑 review_pkg.py → FAIL 80 / WARN 5,与改前完全一致(docs 未配置仍只报 WARN)。
A13 组明细(2026-10-10 新增 · 用户「B05 历史卡片还有 emoji 图标」反馈的机器化 · 覆盖三端 B·D·F · 坑清单 R1-33)
| 编号 | 判定 | 级别 | 对应规则 |
|---|---|---|---|
| A13-1 | 静态图标位容器(class 含 ic/ico/icon/fic/mood/avatar)的直接文本内容为 emoji |
FAIL | 规范B §0.5 第 4 条:图标位只能是 <i class="fa-solid fa-…"></i> |
| A13-2 | 字符串字面量只由一个 emoji 组成(去掉 emoji 后无其他文字)→ 判定为「用 emoji 当图标」 | FAIL | 同上(补 A13-1 抓不到「运行时拼进容器」的洞) |
| A13-3 | 页面用到的每一个 fa-* 类名,在包内 assets/font-awesome/all.min.css(FA Free)里无定义 → 该图标 ::before 为空、渲染成空白 |
FAIL | ★ 2026-10-11 新增(坑清单 R4-27:fa-scalpel / fa-gauge-low 是 Pro 专属,全包实测 5 页中招)。⚠️ 检测前剔注释(溯源注释会正当引用旧图标名);已登记偏差走 FA_GHOST_EXEMPT、以 WARN 报出不静默 |
> ⚠️ 不全文扫 emoji:toast 文案里的 ✓ / ⚠️、代码注释里的 ⚠️ 都是正常用法,全文扫描会大面积误报。判据是「这个位置是不是图标位」+「这个字面量是不是只有 emoji」。
> ⚠️ A13-1 的已知盲区(如实声明):只能抓静态写死在标记里的 emoji。若 emoji 是运行时拼进容器的(如 '<div class="hist-mood">'+icon+'</div>'),容器源码里看到的是 JS 表达式 —— A13-2 正是为补这个洞而加(B05 就属于这种:emoji 存在 var icon 里)。
> A13 正向自测:对修复后的 skill 内置模板(46 页)→ 0 FAIL。反向:改动前的包跑旧版 review_pkg → FAIL 80 条中没有任何一条指向 B05 的 emoji(A6-4 的 <i class="…"> 正则扫不到 .hist-mood)—— 这正是 R1-33 记录的「结构盲点」。
A14 组明细(2026-10-10 新增 · 用户两次要求:「加规范」把图标规格变成机器判据 →「历史数据的各个卡片的样式也不一样,这个也要进行统一规范」· 规范B §3.3.3 · 坑清单 R3-14 / R3-15)
| 编号 | 判定 | 级别 | 对应规则 |
|---|---|---|---|
| A14-1 | 图标规格漂移:.his-ic 的 width/height/border-radius/font-size 四项逐项与基线 34/34/10/14 比对,不符或缺声明 |
FAIL | 规范B §3.3.3 |
| A14-2 | 旧形态回归:.his-ic / .his-card 规则里出现 border-radius:50%(圆形)或 linear-gradient(实心渐变底) |
FAIL | 同上(B03 2026-10-10 前的形态,不得改回) |
| A14-3 | 未登记同类新类:形如 his*/hist*/hic* 且确为「显式宽高 + display:flex」的方块图标容器,却不在基线表 |
WARN | 同上(新页须登记,改脚本基线或配 hist_icon.extra) |
| A14-4 | 卡片骨架规格漂移:.his-card/.his-top/.his-t1/.his-t2/.his-time 的关键属性(圆角 / 内边距 / 间距 / 边框 / 阴影 / 字号 / 字重 / 虚线分隔)逐项与基线不符;或用了 .his-card 却缺骨架类规则 |
FAIL | 规范B §3.3.3「逐项数值」表 |
| A14-5 | 旧类名残留:五页出现本轮废止的旧类名(B03 .hitem/.hicic/.hicbody/.hicl1~3/.hlist-empty;B05 .history-item/.hist-*;B06 .his-fic/.his-freq/.his-med;B11 .his-item/.his-info/.his-r1/.his-state;D19 .hist-*) |
FAIL | 规范B §3.3.3「禁止项」表(改造不彻底的兜底) |
> ⚠️ A14 与 A13 是两层:A13 管「用什么图标」(FontAwesome 而非 emoji),A14 管「图标与卡片装成什么形态」。两组都要过,不能互相替代。
> ⚠️ A14-1 / A14-4 只认纯单类选择器(.his-ic{…})—— 复合选择器(.his-t1 .big{…})是页内局部修饰,不构成该类的基础规格,由 A14-2 单独把关。
> ⚠️ A14-4 与 A14-1 不重复报 .his-ic:图标四项由 A14-1 专管,A14-4 只比对另外五类(同一缺陷只报一次)。
> ⚠️ A14-5 必须先剔除注释再扫 —— 「某类已于某日删除」这类变更溯源注释里会正当引用旧类名(B03/D19 都有),不剔除必然误报成残留。JS 行注释用 (?<![:/])// 匹配,避免把 https:// 当注释起点。
> ⚠️ 基线真源是 规范B §3.3.3:改规格必须先改那一节、再改 review_pkg.py 的 HIST_ICON_SPEC / HIS_CARD_SPEC / HIS_OLD_CLASSES。两处不同步,校验会拿旧规格判新页面。
> ⚠️ A14 只证明「类名与数值对得上」,不证明「取色语义对」 —— B03 的「图标色 == 卡片左侧竖线色」仍属人工验收项。
> A14 正反向自测(2026-10-10 扩组后,11/11 全过):正向对 skill 内置模板(46 页)→ 0 FAIL / 0 WARN,INFO 报「骨架类名命中 his-card、his-ic、his-t1、his-t2、his-time、his-top」;反向构造 → 全抓:B03 图标宽 36px(A14-1 单报)· B05 卡片圆角 10px · B06 主行字号 13px · B11 旧类名 .his-state 残留 · D19 缺 .his-t2 规则(骨架不完整)· D19 图标渐变底(A14-2)· 未登记新类(A14-3 WARN)· .his-time 改实线 · B03 旧类名 .hitem 残留。
> 两项「应不报」也验过:① 注释里引用旧类名 → 不报;② 改非骨架类 .his-tag 的圆角 → 不报(骨架只管骨架)。
> ⚠️ 反向自测的两个坑(本轮踩到):① 必须每次 subprocess 独立跑(read_cached 缓存);② 造缺陷要按「规则块内改属性」定位 —— 直接 str.replace('border-radius:10px', …) 会命中该属性在文件里第一次出现的位置(往往是别的组件),造出的"缺陷"根本没落在被测类上(首版 4 例因此假阴性)。
A15 组明细(★ 2026-10-11 新增 · 需求 4「Excel 生成量表能力冻结」的机器化)
> 立组依据:用户裁定「去掉通过 excel 生成量表的功能提问选项……保留生成量表页面的功能,但不向用户展示,也不执行」。
> 该能力在模板里的唯一真实入口是 F11-量表管理-管理端.html 的「导入题目 / 从Excel导入题目 / 下载模板 / 上传解析」整套面板 ——
> 删掉它,规则才自洽;不删,下一次注入又会有人把它用起来(规范与页面口径分裂)。
| 编号 | 判定 | 级别 | 对应规则 |
|---|---|---|---|
| A15-1 | F11(可用 cfg.scale_admin_page 覆盖,默认按前缀 F11- 识别)静态 DOM / JS 出现 Excel 生成量表入口 —— 文案 导入题目 / 从Excel导入题目 / 下载模板 / 导入量表 / 确认导入到编辑器 / 点击上传或拖拽Excel 任一;或 <input type="file" 配 .xlsx / .xls accept;或 .upload-zone 容器 |
FAIL | Step 4.7.4 |
| A15-2 | 该页仍依赖外部 xlsx 库:xlsx.full.min.js / unpkg.com/xlsx / XLSX. 调用任一 |
FAIL | 同上(能力已冻结,页面不得再依赖该库) |
> ⚠️ A15 只管「Excel → 量表」这一条链路:不禁止其他页面用 Excel 做数据导出(F03-数据下载 的导出能力属独立功能,不在本组范围内)。
> ⚠️ .upload-zone / .uz-* 类名只在 F11 内属本组管辖 —— 其他页另有上传控件(如患者端 B11 上传资料)不受影响。
> ⚠️ A15 与 A13 / A14 的关系:A15 管「某个能力该不该出现在页面上」,A13 管「图标用什么」,A14 管「卡片长什么样」—— 三组各管一层,都要过。
> A15 正反向自测(2026-10-11):正向对改造后的 F11 → 0 FAIL;反向对改造前的 F11 → A15-1 / A15-2 双报;对 F03-数据下载(合法含 Excel 导出)→ 0 FAIL(不误报)。
7.2 取证纪律(禁止凭印象)
每条复核结论必须附四类证据之一:
- 脚本输出(
verify_pkg.py/review_pkg.py) - 与备份的
difflib逐行 diff - 关键词命中数(改前 vs 改后)
- 无头实测结果或截图
> 「我记得改过了」不构成证据。未取证的条目一律记为「未复核」,不得计入通过。
7.3 复核清单(逐项打勾,未勾即未过)
7.3.1 需求层
- [ ] Step 5 确认单中每一条都有一条复核记录(条目 → 证据 → 结论)
- [ ] 用户明确要求「保留不动」的项,确认确实没动(diff 佐证)
- [ ] 用户明确要求「停用 / 删除」的项,确认入口、索引、TSV、计数四处都已同步
7.3.2 规范层
- [ ] 未向用户建议新增功能页(★ 2026-10-11 铁律)—— 本次执行中提出的建议项全部落在现有页面内;若确有新增页,动议来自用户(Step 3 硬约束 4)
- [ ] 未打包、未自行改版本号(★ 2026-10-11 铁律 T0-d)—— 除非用户明确说了「打包 / 封版 / 提交 / 上架」或给出版本号
- [ ] 规范A 对应页的必改项全部落实(配置项 B1/B2/B3 全过)
- [ ] 编码层(第 3 步)已清:糖尿病底版 / 肛肠底版 / 真实姓名 全包 0 命中(A1/A2/A3)
- [ ] 旧值在全包范围内为 0(不只本次改过的页)
- [ ] 新值在全包范围内确实出现(防漏改)
7.3.3 铁律层(T1)
- [ ] 改动都能对应到需求里的一句话(不能对应的=越界改动,回退)
- [ ] 无新增未明确元素(图标 / 字段 / 按钮 / 区块 / 标签 / 文案 / 颜色 / 层级)
- [ ] 无删除 / 合并 / 重排既有元素
- [ ] 未改布局与排版格式(网格列数 / 分区顺序 / 间距 / 对齐 / 卡片结构)
- [ ] 有疑问处都先问过用户,未自行补位
7.3.4 一致性层
- [ ] B04 ↔ D26 四组数据逐字符一致
- [ ] 量表库六处(B07 / D13 / D15 / D19 / D04 / D30)同名量表措辞一致
- [ ] 报告链路(B07 RPT_OF → B14 REPORTS → B15 DATA → D27 REPORT_SETS → D28 DATA_BY_PT)id 与名称对得上
- [ ] 报告详情「两类内容分派」(2026-10-09 用户裁定):B15 / D28 每条报告带 type(scale / complex);量表评估报告只渲染 ① 量表评估与报告、三块(②综合评估 + ③体征监测 + ④用药打卡)只在 type:'complex' 渲染;量表报告条目不含 score / rows / monitor / med。验收:抽 ?id=sc1 只看到一块、抽 ?id=cp1 四块齐全(对照 规范A 15-6b / 21-5b / 25-27,根因见 坑清单 R1-29)
- [ ] 症状通道(B03 ↔ D01 ALARMS ↔ D11)同源
- [ ] 宣教(B10 ↔ D23 CONTENTS ↔ D30 EDU_LIB)同源
- [ ] 日程(B08 ↔ B09)同源 —— ⚠️ ★ 2026-10-11 起医生端日程已下线:D04 的日程区块、D25 的入口均已删除,本条不再比对 D 端
- [ ] 患者后端 → 医生端承接成对齐全(新增上报页必有医生端三段承接)
- [ ] 患者端 UI 口径一致(A6 组 0 FAIL):标题栏无副标题 / 无计数;历史区块 fa-clock-rotate-left + 历史数据 全包唯一;二级页标题栏背景唯一、文字颜色与背景明暗匹配(深底白字);铃铛角标 = 待办数量
- [ ] 图标一律 FontAwesome(A13 组 0 FAIL):全包三端无 emoji 充当图标 —— 图标位容器内容必须是 <i class="fa-solid fa-…"></i>;「只由一个 emoji 组成的字符串字面量」一律视为违规(规范B §0.5 第 4 条);★ 且每个 fa-* 类名必须在包内 FA Free 的 all.min.css 里有定义(A13-3,防 Pro 专属图标渲染成空白 —— 坑清单 R4-27)
- [ ] 历史卡片新骨架(★ 2026-10-11 二次统一):四个上报页(B03/B05/B06/B11)的卡片 —— 行2 无图标列(.his-ic 已删)、内容左对齐;卡片右上角有审核状态标签(待审核 / 已审核 / 已驳回,四页三态齐备);右侧有删除按钮(.his-del,图标形式无文字、垂直居中跨行2/行3);行1 周范围前带「第 x 周」;已驳回不显示驳回理由;行1/行3 其余口径不变(规范B §3.3.3)
- [ ] 历史卡片删除交互(人工验收):仅 待审核 态可点删除 → 弹确认 → 真删(数组移除、列表实时减少);已审核 / 已驳回 态按钮置灰不可点
- [ ] 历史卡片「统一骨架」跨页一致(A14 组 0 FAIL):三页(B03/B05/B06/B11 + 医生端 D19)均为卡片形态、类名与结构同为一套 .his-* —— .his-card 圆角 14px / 内边距 11px 12px / 间距 9px / 1px 边框 + 阴影;.his-ic 34×34 / border-radius:10px / font-size:14px;主行 14px/700、副行 12px、时间行 11px + 1px dashed 虚线分隔;无圆形 / 无渐变实心底 / 无旧类名残留;新增含历史数据的页直接复用 .his-*(A14-3 报 WARN 即为未登记)—— ⚠️ 取色语义(如 B03 图标色 == 卡片左侧竖线色)仍属人工验收项(规范B §3.3.3)
- [ ] 时间基准(A10 组 0 FAIL):每页引入 assets/js/timeshift.js;日期字面量全部经 TS()/TS_RANGE();nowStamp() / demoNow() / OP_DATE 均取真实当前时间(规范B §5.4)
- [ ] 用药打卡粒度(A11 组 0 FAIL):B06 含 .week-picker 且不含 .time-picker;全包无 .day-picker / .month-picker —— 用药打卡硬性按周,未把选择做成待选项(规范B §5.1)
- [ ] 健康日记打卡区排序(A6-11 0 FAIL):B05 中病种专属打卡项在前、通用项(运动/睡眠/体重…)在后;新增专属项插到最顶(规范B §5.3)
- [ ] 规范B §2.4「十四条硬规则」逐条打勾(B-7 / B-8 / B-10 为人工验收项)
- [ ] 医生端 UI 口径一致(A7 组 0 FAIL):一级页标题栏「图标 + 名称」成对;宫格业务蓝在前、管理紫在后;会话头部两行(身份 / 诊断)且第一行姓名 / 性别年龄分级;量化专病指标独立成趋势卡;标题栏文字颜色与背景明暗匹配(深底白字)
- [ ] 趋势卡只在单患者上下文出现(A7-4b 0 FAIL):D04 显示;处理页仅带 ?name= 时由 JS 动态插入,默认全患者清单不渲染;KPI 由当前患者记录派生(无字面量)
- [ ] D 端底栏与全局徽章一致(A8 组 0 FAIL):五页底栏尺寸 + 视觉口径同款(25 项,实测均 50px 且计算样式 90/90 一致);「预警」徽标五页齐备且同值 = D02 预警列表「未处理」条数
- [ ] 量化专病指标数据同源:患者端打卡页 ↔ D04 ↔ 处理页(单患者上下文),KPI 数值逐字符一致、曲线点数 = 患者端历史条数;处理页换 ?name= 时 KPI 随之变化
- [ ] 规范B §1.4「九条硬规则」逐条打勾
7.3.5 交付物层
- [ ] 甲层 · 成套产物齐备(重点项,2026-10-08 起;★ 2026-10-10 收窄):① 服务包页面 ② 产品功能清单/ 按需产出的文档 ③ 更新说明-YYYYMMDD.md(含「页面 ↔ 文档」对照表 + 本次文档产出小结)
- [ ] 本次新增页都写了文档;结构级大改页(分区增删 / 骨架顺序变化)已整篇重写;其余改动过的页未产出文档(这是对的,不是漏);删除页未加作废声明(新规则允许)
- [ ] required_pages 已在临时复核配置里显式声明(本次无新增页、无结构级大改则写 [])
- [ ] 邻页文档跟着改过:新增 / 删除页导致的出链、入链变化已同步进对应邻页文档 §四
- [ ] 量表页配套(条件项 · ★ 2026-10-11 收窄):仅当包内存在 scale/*.html(即用户主动提交了量表文档)时才是必查项 —— 此时每张 scale/*.html 都要有同短名的 scale/*.md 报告生成提示词,check_scale_docs.py 退出码 0,《更新说明》已登记;包内无 scale/ 时本项不适用、直接视为通过(默认路径下不再产出 scale/)
- [ ] F11 无 Excel 生成量表入口(A15 组 0 FAIL)(★ 2026-10-11)—— 该能力已冻结,不得展示、不得执行
- [ ] 包外唯一产物齐备(★ 2026-10-09):本次注入-更新范围确认单.md 已出,§1–§7 按分支填全(分支 B 另含 §8);包外目录里不得出现任何其他文件 —— 台账 / 改动摘要 / 校验报告 / 缺陷登记 / 复核配置 / 源包判定单 / 资产清单 / 术语三色表 / 残留矩阵均已取消
- [ ] 备份存在,回滚命令已与用户确认可用
7.3.6 解绑验收层(仅分支 B,逐条过 规范C §10)
- [ ] C-1 前序病种术语(🟢🟡 全量)全包 0 命中(白名单例外逐条登记并写明理由)—— A9-0
- [ ] C-2 文件头注释 0 命中前序病种术语 —— A9-1
- [ ] C-3 时间轴口径全包唯一,无前序口径残留;文案 ↔ 数值 ↔ data-* 三者一致 —— A9-2 + 人工数值比对
- [ ] C-4 残留矩阵每一行的处置都已完成并取证,无"未复核" —— 对照确认单 §8.3 逐行打勾
- [ ] C-5 镜像对全部成对同步,同源字段逐字符一致 —— A9-4
- [ ] C-6 删除页同步齐全(文件 / 入口 / 索引,+若包内有页数计数器则含计数)—— 人工核对
- [ ] C-7 无「目标病种名 × 前序病种概念」共现 —— A9-3
- [ ] C-8 无前序病种字典键与注释残留;后端标识(model_version / model_code)未被误改 —— A9-5 + 人工
- [ ] C-9 专属内容资产群(问卷 / 科普 / 病历模板 / 量表题库 / 标签库 / 科研队列 / 预警类型 / 随访模板)已按处置清单完成 —— 对照 Step B1 第 2 类清单
7.4 发现问题的处置(就地闭环)
- 立即修复该处(不攒到最后)
- 判定回归范围:
| 问题性质 | 必须重跑 |
|---|---|
| 单页文案 | 该页相关项 + L1 |
| 数据 / 结构 | L1 + L3 + L4 |
| 跨页同源数据 | L4 全组 + L1 |
| 编码层标识符 | A2/A3 全包复跑 + L1 |
| 改动到页面的分区结构 / 骨架顺序(分区增删、骨架重排) | L5 文档层:该页文档整篇重写(规范D §七)+《更新说明》登记 + check_docs.py + A12 组 |
| 仅改动数据 / 样式 / 文案 / 功能点 / 链路(分区与骨架未变) | 不产出文档;L5 只需对包内已有文档跑一次 check_docs.py + A12 组(required_pages 通常为空) |
| 本次新增页面 | L5 文档层:为新增页新写文档 +《更新说明》对照表 + 正文补进 required_pages |
| 本次删除页面 | 不需要做任何事(★ 2026-10-10:删除页不用声明)—— 其文档原样留档 |
- 重新取证;不得跳过重跑直接标记通过
7.5 根因追查(RCA)—— 「不要一个错误多次犯」
每个缺陷必须归因到四类之一:
| 代号 | 类别 | 回写对象 | 是否需用户确认 |
|---|---|---|---|
| R1 | 规范 / 清单缺失或歧义 | references/规范A / 规范B / 规范D / 规范E(均为 skill 内本地资产,无外部正本) |
需确认 |
| R2 | 数据语义错位(文案改了数值没改 / 多处拷贝不同步 / 映射键没改) | 同上 | 需确认 |
| R3 | 执行手法错误(锚点 / 拼接 / 正则 / 选择器) | references/坑清单-已知缺陷与防复发.md |
自动追加 |
| R4 | 校验手段不足(没查到 / 只查了单页) | scripts/review_pkg.py 规则 |
自动补充并告知 |
判定顺序(逐层问,问到即止)
- 清单 / 规范里有没有写这一项?→ 没写 = R1
- 写了但含义有歧义、或与源码不符?→ R1
- 规范没问题,是数据语义没对上(文案 / 数值 / 映射键)?→ R2
- 规范没问题、数据也对,是执行时写错了(锚点 / 拼接 / 正则 / 选择器)?→ R3
- 前面都对,但复核时没查出来(是用户或后来才发现的)?→ R4
回写落地(必须做,否则等于没追根因)
- R3 → 在坑清单对应类别追加一条(症状 / 根因 / 防复发 / 取证)
- R4 → 在
review_pkg.py补上能查出该问题的规则,并用已知样本自测(如sm10/患者01) - R1 / R2 → 产出「建议回写内容」;等用户确认后再改 skill 内的规范文件(
规范A/规范B/规范D/规范E) - R3 / R4 类直接追加进
references/坑清单-已知缺陷与防复发.md(skill 自身资产,属工具维护);不再另出缺陷登记文件 —— 结论在对话里给出 - ⚠️ 复核发现的每个问题都要有落点:要么进坑清单、要么进确认单、要么在对话里说清 —— "发现过但没记录"不算完成
根因记录字段(写进坑清单条目;不再单独成文件)
| # | 现象(含页面/行) | 根因类别 | 影响面 | 修复 | 防复发措施 | 已回写 | 证据 |
|---|---|---|---|---|---|---|---|
7.6 复发判定与机制升级
- 坑清单里已登记过的坑再次发生 → 判为机制性缺陷
- 处理:停下,向用户报告三点 —— ① 该坑已登记却仍复发 ② 现有防复发措施为什么没拦住 ③ 2–3 个备选机制方案;用户选定后再继续
- 同一 R 类在单次注入中出现 ≥ 2 次 → 同样按机制性缺陷处理
- 禁止:把复发问题当新问题重新登记一遍了事
7.7 交付判定(全绿才交付)
| 项 | 要求 |
|---|---|
verify_pkg.py |
退出码 0 |
fetch_fonts.py check(T0-b) |
退出码 0;交付包内 assets/font-awesome/ 需含全部字体 —— 字体缺失时走本地字体的页面图标静默全废,且现有校验脚本都查不出来 |
review_pkg.py |
A 组 0 FAIL;B 组按配置全过 |
review_pkg.py A12 组(文档产出)★ |
0 FAIL(docs 未配置时整组跳过并告警;交付时必须已配置,且 required_pages 已显式声明) |
review_pkg.py A13 组(图标一律 FA) |
0 FAIL(三端无 emoji 充当图标) |
review_pkg.py A14 组(历史卡片统一骨架)★ |
0 FAIL;A14-3 的 WARN 须逐条判清:确属历史卡片行前图标 → 补登记(并同步 hist_icon.extra);确属其它组件的同名巧合 → 登记进 hist_icon.exempt_classes。不得留悬空 WARN |
check_docs.py(文档内质)★ |
FAIL 项 0 |
check_scale_docs.py(量表配套)★ |
退出码 0(包内无 scale/ 时视为不适用、直接通过)—— 作答页 ↔ 报告提示词一一对应 + md 骨架 / 变量 / 必含句 R1–R8 / 五段 / 两附 / 示例隔离 / 自包含 / 篇幅 + 事实底稿取自本页 |
| 甲层成套产物(页面 / 按需文档 / 更新说明)★ | 三者齐备:本次新增页与结构级大改页都有对应文档;《更新说明》含「页面 ↔ 文档」对照表 + 本次产出小结(0 份时已写明)。⚠️ 文档数 < 页面数是正常状态 |
review_pkg.py A9 组(分支 B) |
0 FAIL(debind 未配置时整组跳过) |
| L2 需求层 | 确认单逐条有证据,无「未复核」 |
| L4 一致性层 | 0 FAIL |
| L5 文档层 ★ | 0 FAIL(=上三行之和:A12 组 + check_docs.py + 甲层三者齐备) |
| 解绑验收层(分支 B) | C-1 ~ C-9 全过 |
| 缺陷的根因落地 | 每个缺陷都有根因类别 + 防复发措施 + 证据,并已写进 references/坑清单(或在对话里说清落点) |
| 备份 / 回滚 | 备份存在,回滚命令已确认 |
任一不满足 → 不得交付,回到对应步骤。
通过后:更新台账为「已完成」,交付甲层成套产物 + 乙层六份交付物 + 复核结论摘要(含 WARN 项与「已知接受项」)。
交付后再变更(增量同步 · 2026-10-08 用户硬要求)
> 用户原话:「如果用户生成完后,又修改了某些 html 页面,或新增了 html 页面,也执行相同的操作。」
> 即:交付不是终点。页面再变一次,就按 6.7.1 重新判一次「要不要产出文档」 —— 只有命中「新增页 / 结构级大改」才产出(重写的文档升一版),其余改动不动文档。《更新说明》每次都要出。
触发条件(任一命中即走本节):
| 触发 | 例子 |
|---|---|
| 用户改了某个已交付的 html 页面 | 调整某卡片的字段、改状态机、改文案结构 |
| 用户新增了 html 页面 | 加一个病种专属上报页 + 医生端承接页 |
| 用户删除 / 停用了页面 | 摘掉某入口页 |
| 用户改了包内共用的 JS / CSS / assets | 改 timeshift.js 基准日 |
执行路径(不对重走 Step 1–5 —— 需求已定,只跑变化面):
| 步 | 做什么 |
|---|---|
| ① 重新入闸 | 跑 detect_source_pkg.py 留证(包已成型,仍须留证);读 本次注入-更新范围确认单.md(§1 判定 + §5 范围)恢复上下文 |
| ② 差异盘点 | 与上一次交付的包副本做 diff -rq,逐页确认"用户改了什么" —— 用户未提及的改动一律先问(同 Step 6.1) |
| ③ 范围确认 | 只需确认变化面的档位(通常 1~2 档),并把变化项登记进 本次注入-更新范围确认单.md 的续页;变化面含"用户要加新功能"时,Step 4.1 / 4.2 两道闸门照走(功能清单只列变化面涉及的两端页;新增需求必须走完需求卡 → 回读 → 「正确」确认) |
| ④ 备份 | 改动前整体备份为 <包目录>_bak_YYYYMMDD_HHMM(同上一次交付的包一起备份,便于回退到任一版本)。不需要再复制文档基线(2026-10-10 起不做基线比对) |
| ⑤ 改页面 | 按 T1 / T1-b 与 规范A / 规范B 执行;新增页必须成对(患者端上报页 ↔ 医生端三段承接) |
| ⑥ 文档按需产出 | 按 6.7.1 判(只认两条结构变化):新增页 → 写文档(版本 A);分区增删 / 骨架顺序变化 → 整篇重写该页文档(升一版);其余改动一律不产出文档(数据 / 文案 / 样式 / 功能点 / 链路)。不做基线比对、不做全量重写、删除页不声明 |
| ⑦ 更新说明 | 新出一份 更新说明-YYYYMMDD.md,只说明本次新生成了哪些 md 文档(「页面 ↔ 文档」对照表 + 本次产出小结;0 份时写明「本次无新增页、无结构级大改,未产出文档」) |
| ⑧ 复核 | L1~L5 全跑(verify_pkg.py / review_pkg.py --config(含 docs 块)/ check_docs.py / 无头实测);A12 组 0 FAIL、A13 组 0 FAIL、A14 组 0 FAIL(A14-3 的 WARN 逐条判清) |
| ⑨ 交付 | 交付新版成套产物,并在台账追加一条版本记录 |
硬约束
- ⚠️ 不得跳过文档产出:本次新增页 / 结构级大改页没写文档 = 不成套,不得交付;反过来说,非这两种情况的页面改动不需要、也不应该产出文档
- ⚠️ 不得整批重写文档:重写会抹掉 §九 变更记录与 §五 的"已于某日处理"标注,追溯链断掉
- ⚠️ 不得顺手补齐文档:改了数据 / 样式 / 文案 / 功能点的页就是不该产出文档;「既然打开了顺手补一份」属违规(规范D §七)
- ⚠️ 不得只改文档不改页面:文档是页面的描述,页面是事实来源(规范D §五);发现文档与页面不符,先确认哪个是对的,再问用户
- ⚠️ 版本号只增不减:A → A2 → A3;不得复用已用过的版本号
- ⚠️ 变化面里若含跨页同源数据(同源键 / 量表库 / 报告链路 / 宣教库 / 患者端日程),按 7.4 回归范围跑 L4 全组
中止与异常处理
| 情况 | 处理 |
|---|---|
| 用户要求与 T1 冲突(如要求改布局排版) | 先说明冲突,取得用户明确授权后方可例外执行;授权须记入台账 |
| 联网检索不到医生姓名 | 如实说明,保留占位符,不臆造 |
| 用户未回答数据来源 / 未确认档位 | 不得执行档位 2 及以上 |
| 用户要求跳过 Step 4.1 功能列表确认、直接开做 | 停下说明:4.1 是强制闸门(2026-10-08 用户硬要求),须先把两端功能清单列全并取得确认;不得以"模板够用""不用看了"为由跳过 |
| 用户提出要加新功能但未取得二次确认(未答复"正确") | 停下:先按 4.2.2 把要素追问齐 → 4.2.3 出需求卡 → 4.2.4 回读并取得「正确」答复;不得按自己的理解先做、不得"先做一版给你看" |
| 用户对需求卡的回复是"差不多""大概对" | 不算通过:按 4.2.4 重新回读,逐条问「这一条对不对」,直到拿到明确的「正确」或逐条修订结论 |
| 用户要求用药打卡按日 / 按月 | 停下说明:本 skill 用药打卡硬性只允许按周(2026-10-07 用户裁定,规范B §5.1);不得改为 .time-picker / .day-picker / .month-picker。确需改口径须先经用户明确授权并改 skill 规则,不得就地改页面 |
| 用户未说明源包来源(自带目录 / zip / 内置模板) | 停下问,不得默认取内置模板(可能覆盖用户既有成果) |
| 源包与内置模板的差异涉及用户未提及的改动 | 停下报告,逐页确认后再继续 |
| 源包页数与基线不符(46 页以外的页数体系) | 以源包实际文件清单为准,重新核对基线并写入台账;不得按任何固定页数口径凭空补页 |
源包内出现 A01* 文件 |
停下问用户(与「A01 已删除」的既定基线冲突),不得自行处置 |
| 有人要求就地修改模板本体 | 拒绝;改为 cp -R 复制到用户指定目录后再改,模板保持只读基线 |
| 执行中发现未预期的既有改动 | 停下报告,等用户裁决 |
| 用户中途改变需求 | 更新台账,回到受影响的最早步骤重走 |
| 页面数与基线不符 | 以实际文件为准,先与用户核对再继续 |
| 发现规范与源码不一致 | 以源码为准,并在交付摘要中记录该不一致 |
| 复核不通过 | 就地修复 → 按 7.4 回归范围重跑 → 重新取证;不得跳过重跑直接标记通过 |
| 已登记的坑再次复发 | 判为机制性缺陷:停下报告(坑 + 为何没拦住 + 2–3 个备选机制方案),等用户选定 |
| 同一 R 类出现 ≥ 2 次 | 同上(按机制性缺陷处理),不得当新问题重新登记了事 |
| 复核发现越界改动(违反 T1) | 回退该处,并按根因写进 references/坑清单(R3 执行手法 / R1 规范歧义) |
| 源包类型不可判定 / 判为混合 | 停下问用户,不得猜测分支(判错分支 = 后面全错) |
| 分支 B:用户未给出前序病种名 | 停下;前序病种名必须明确,否则无法建立词表 |
| 分支 B:三色分类里两色拿不准 | 按黄处理(从严),逐处上下文判定;不得降级为绿直接全局替换 |
| 分支 B:发现包内还有第三个病种残留 | 停下报告(该包是多次改动叠加),等用户裁决 |
| 分支 B:某页解绑后与目标病种语义冲突 | 停下问用户,不得自行取舍 |
| 分支 B:包内出现接口驱动的数据块 | 停下报告:本 skill 只处理静态包,接口包不在范围内,不得按静态包继续 |
| 镜像对只改了一端 | 视为未完成,不得进入复核(A9-4 机器判定) |
| T0 门禁未通过 | 立即中止:不读 references/、不跑 scripts/、不进入 Step 0。向用户索取口令并 unlock;用户不给口令 = 不执行。不得猜口令、不得手工构造授权标记、不得把口令写进任何产物或回复 |
gate.py unlock 报口令错误 |
记为失败 1 次并如实告知「口令不正确(已试 N/3)」;允许再试,累计达 3 次即终止,明确告知「口令不正确,无法继续执行本 skill 的任何步骤」。不得连续试错、不得遍历、不得降低校验(如临时改脚本跳过校验) |
| 口令已错 3 次后用户仍要求继续 | 不执行。可说明:3 次上限是作者设的硬停线;若用户确为作者,请其核对口令,或由作者执行 python3 scripts/gate.py reset 后重新走 T0(AI 不得代改授权标记) |
| T0-c 更新检查退出码 2(离线 / 接口异常) | 不阻断:如实告知「本次未能检测到更新」,继续 T0-b;不得因此停摆,也不得谎报「已是最新」 |
| T0-c 提示「本地版本高于平台」 | 按「已最新」处理,把警告原样告知用户(通常是本地有未上架的改动);不得执行覆盖 —— install --force 会删目录重解压,本地改动全丢 |
| 检测到有更新、用户不同意现在更新 | 台账记一行「用户选择暂不更新(本地 X / 平台 Y)」,继续本流程;不得反复追问 |
| 用户同意更新,但整目录备份失败 | 停止更新:无备份即不可回退,不得执行 install --force。先解决备份失败原因(磁盘空间 / 权限),或改由用户手动更新 |
| 更新执行失败(下载失败 / 解压失败 / 校验不过) | 就地回滚:用备份整目录覆盖回原 skill 目录(rm -rf <skill> && cp -R <备份> <skill>),复跑 gate.py check 与 fetch_fonts.py check 确认可用;失败原因与回滚结果如实告知 |
| 更新成功(版本已变为平台版) | 停下,提示用户重开一轮对话 —— 本轮上下文里加载的是旧版规则,新旧混用会出错;台账记「已升级 X → Y」 |
F11 出现 Excel 导入量表的入口 |
删除(★ 2026-10-11 能力已冻结)—— 该入口是「通过 Excel 生成量表」的唯一真实载体,留着与用户裁定矛盾;改完跑 review_pkg.py A15 组确认 0 FAIL |
| 用户主动提交量表文档、但文档缺项(仅冻结路径下适用) | 逐项追问,不得自行补位(选项数不匹配 / 无计分规则 / 反向计分未标 / 多选上限 / 李克特档位 / 分值区间解读 —— 清单见 规范E §2.2) |
| 提交的量表文档是 PDF 扫描件 / 双栏混排 | 逐页阅读核对,必要时请用户提供 Excel/Word 或文字版;不得凭版式猜题数;解析不确定处一律回读确认 |
| 用户对量表解析的回复是"差不多""基本对"(仅冻结路径下适用) | 不算通过:按 4.7-附 ② 重新回读、逐条问,直到拿到明确「正确」或逐条修订结论;未取得「正确」前不得生成任何页面 |
用户要求把 scale/ 量表页做成 B/D 编号页 |
先说明口径:scale/ 是按文档增生的附属页,不进编号体系(规范E §一)。若用户确要纳入编号体系,须取得明确授权,并同步改 review_pkg.py 的 A12-1 口径与确认单,不得就地改完就走 |
| 用户要求"先别管门禁""帮我跳过" | 不执行。可说明:门禁是作者设的使用授权,AI 无权重写授权状态;若用户确为作者,请其用正确口令 unlock(忘记口令则先 gate.py reset 再重新输入) |
| 交付后用户又改了 / 又加了页面 | 走「交付后再变更」:按 6.7.1 重判一次 —— 新增页必须写文档;结构级大改页重写文档;其余改动不产出文档;《更新说明》每次都要出 |
| 发现文档与页面不符 | 停下:先确认是页面错还是文档错,再问用户;不得自行按文档改页面、也不得按页面改文档 |
| 新增了页面但未补文档 | 视为未完成交付(A12-1 机器判定);提示用户需补文档后才可交付 |
| 页面被删了 | 不需要做任何事(★ 2026-10-10 用户裁定「删除页面也不用声明」):其文档原样留在包内即可,A12-2 只报 INFO |
| 某页改了却没产出文档,用户问是不是漏了 | 按 规范D §二 解释:只有「分区增删 / 骨架顺序变化」才产出文档;数据 / 样式 / 文案 / 功能点增删类改动本来就不产出 —— 这是规则,不是遗漏 |
| 用户要求"先交页面,文档回头再说" | 说明冲突:本次新增页 / 结构级大改页的文档是成套交付的组成部分(2026-10-08 用户硬要求)。取得用户明确授权后方可先交页面,且交付时必须声明"本次文档未产出,本版不成套"。⚠️ 若本次本就不该产出文档(无新增页、无结构级大改),则不存在"缺文档",不适用本行 |
不适用场景
| 场景 | 说明 |
|---|---|
| 单页纯文案修改 | 直接改,不必走 Step 0–7 流程。且不需要动文档(★ 2026-10-10:只有分区增删 / 骨架顺序变化才产出文档;纯文案修改不属于) |
| 纯诊断 / 评估需求 | 走其他 skill |
| 无任何模板的全新系统 | 本 skill 依附于既有服务包(通用型 或 病种专属成品包);从零建包不适用 |
| 涉及真实患者数据 | 需先匿名化,本 skill 不处理真实 PII |
| 已接入 MDH 接口的包 | 本 skill 不适用 —— 只处理静态包(纯静态 HTML 演示 / 交付包)。遇到接口包停下声明不适用,不得按静态包硬跑 |
references 索引
| 文件 | 用途 | 适用分支 | 何时读 |
|---|---|---|---|
模板基线-通用型46页.md |
内置模板的配套说明:46 页逐页清单 + 字节数 + SHA256(16) / 两段式用法(差异盘点 · 默认源包)/ 差异判定规则 / 模板维护规则 | 仅 A | Step 0.1 必读;Step 6.1 差异盘点时对照 |
规范A-病种注入执行清单-V2.md |
通用型 46 页口径的逐页注入项(960 行 / 641 行表格 / 471 项)+ 编码层清理 + 核验。⚠️ A01 段已作废(用户已删除 A01),其对应的核验项不适用 |
仅 A | Step 0 必读;Step 5/6 按需检索 |
规范B-新建页面规范-V2-医患两端.md |
铁律 + 外壳/标题栏/底栏/组件/业务闭环/定制化/卡片格式 + §1.4 医生端九条硬规则(D-7 含底栏视觉 25 项口径)+ §2.4 患者端十四条硬规则 + §3.3.2 历史卡片「行序 + 文案」口径(★ 新建含历史数据页面的强制标准) + 自检清单(§十一 E / H 各含一条历史卡片强制项) | A / B 通用 | Step 0 必读;Step 6 必读 |
规范C-源包解绑规范.md |
分支 B 的唯一逐页依据:源包类型判定 / 前序病种资产清点(六类)/ 术语三色分类 / 八类残留载体扫描法 / 逐页处置决策矩阵 / 时间轴口径迁移 / 镜像成对同步 / 字典键·注释·标识符处理 / 解绑验收 C-1~C-9 | 仅 B | 分支 B:Step 0 与 Step B0–B4 必读;Step 6/7 按需检索 |
规范D-产品功能清单文档规范.md |
交付文档规范(成套交付的甲层 · ★ 2026-10-10 整体收窄):§〇 本轮规则变更(只有新增页 / 结构级大改页产出)/ 八节骨架(取消 §九)/ 绝对禁令(占位符化、零模拟数据)/ 逐节写作要点 / 事实来源与最小核对清单 / 交叉页一致性 / §七 产出规则(判据只认结构变化;不做全量生成、不做基线复制平移、删除页不用声明、不要求页数=文档数)/ §八《更新说明》(收窄:只说明本次新生成了哪些 md 文档)/ 口径统一表 / 完成前自检 | A / B 通用 | Step 6.7 必读(每次交付都要读);Step 7.1 L5 文档层对照 |
规范E-量表文档转HTML页面规范.md ⏸️ |
量表文档 → HTML 作答页规范(冻结能力:默认不读、不执行;仅用户主动提交量表文档时按 Step 4.7-附 启用):<包目录>/scale/ 目录与命名 / 抽取纪律(禁止臆造 · 缺项追问清单) / 页面骨架(复用 B07 范式)/ 数据契约 SCALE_DEF / 可填写 · 可提交(必答校验 / 计分 / localStorage / 已提交态 / 如实告知本地留存)/ 与 B07 及 D 端五处的同源闭环 / §九 15 条自检清单 / §十 反例 / §十一 订正记录(2026-10-09:§四 数据契约与 §五 留存记录结构改为实际实现形态 —— 由原示例的 dims/reverse/required 与 {answers, score, level, submittedAt} 订正为 groups/options+funcOptions/items[{no,g,stem,note}] 与 {scale, answers, total, func, risk9, submittedAt}) |
A / B 通用 | Step 4.7.4 必读(用户提交量表文档时);Step 6 生成量表页时对照;与 规范F 配套 —— 本规范管「作答页」、规范F 管「作答页 → 报告」 |
规范F-量表报告生成规范.md ⏸️ |
量表「报告生成提示词」规范(冻结能力:同规范E,按 Step 4.7-附 启用):每张作答页配套同短名 <短名>.md / md 12 节骨架 / 8 个变量契约(含静态包 localStorage 实况) / SCALE_DEF → 提示词概念映射 / ★红线一:禁止用先验知识补分级 / 风险分层与紧急处理 / 运行时报告固定五段 + 两附 / 输出格式两段(md 自身 / 运行时报告) / 示例隔离三件套 / 边界情形(无分级·无维度·不计分·无风险条目…) / §十二 check_scale_docs.py C1–C13 / §十三 自检清单 / §十四 反例 |
A / B 通用 | Step 4.7.5 必读(每张量表都要走);Step 7.1 复核 check_scale_docs.py 对照 |
坑清单-已知缺陷与防复发.md |
根因四分类(R1 规范缺失 / R2 语义错位 / R3 执行手法 / R4 校验不足)+ 105 条已登记坑及防复发措施(★ 2026-10-11(三)新增 3 条:R1-36(规范里的类名口径停在已下线页面 —— D04/D25 日程区块当天已下线,规范B §4.2.1 却仍按 .dot.on/.sc-node.cur/.sc-nm 写,照规范去改 B08/B09 一条类名都对不上 → 规范必须附「实现映射表」、页面下线时同步扫规范)· R3-34(B09 默认月份写死 2026年8月 → 时间平移后事件全落在 9~10 月,日历圆点永为 0、刚补的三态色板一个点都看不到 → 「与当前时间相关的视图游标」一律由 TS_TODAY_STR 派生,并断言「当前视图内有事件元素」)· R4-28(状态/配色改造只断言类名存在、不断言计算色值 → 「类名换了、色没改」照样 pass;同批还抓到 TS('2026-08-29') 冒充「今天」→ 必须 getComputedStyle 取 RGB 逐项核对,且图标底与胶囊同源断言);2026-10-10 新增 R2-7(种子数据按「真实今天的直觉」写、忽略基准日 → 演示出未来时间;A10 不查此语义)与 R1-34(版本号自行累加、从未与平台对账 —— 本地记到 1.0.8、平台实际 1.0.4 → 版本号由用户指定 + 升版前先对账)与 R4-21(校验器不认包装函数 —— seedT 包装被判「日期未走 TS()」 → 日期字面量必须直接写在 TS 调用里);R3-15:「行序一致」被当成「样式统一」—— 五页只对齐了行序、卡片形态仍是五种(圆角 12/10/14/无、边框四种、阴影有/无、间距 8/9/0)→ 五页统一为 .his-* 卡片骨架 + A14 扩为 5 条;R3-14:跨页「同规格」结论未逐页取证就写进规范 —— 把「看起来一样」当成「实测一样」(B03 实为 36×36 圆形渐变实心,全包唯一)→ 规范改逐页规格表 + 禁「均…级」概括;R1-33:规范只写「统一 FA6 Solid」没禁止用 emoji 当图标,且校验从不检查「图标位放的是不是图标」→ 立规范B §0.5 第 4 条 + 新增 A13 组(静态图标位 / 裸 emoji 字面量)+ B05·F07 改 FA;R4-20:校验正则把「属性顺序」当不变量 —— 元素再挂一个 style 就静默跳过整页(B03 历史区图标因此长期逃检)→ 正则放宽为 class="…"[^>]*> + 立「校验器也要做正反向取证」原则;R1-32:设计标准只写在"页面改动记录"里、没进「新建页面自检清单/铁律闸门」 → 新建页面永远继承不到;并暴露 §6.2 与 §3.3.2 边界不明 → 标准升格 + 接入 §十一 E/H + 划清分工;R3-13:改了"静态 HTML 默认值"却没改 JS 赋值源 → 改完看着像生效、其实被覆盖(B02 proPkg)—— "文本在 HTML 里" ≠ "文本由 HTML 决定";2026-10-09 新增 R1-31:包外过程文件「份数与名字都不确定」(同一次 skill 跑出 10/6/6/2 四种)—— 清单只写下限、没写上限,加上分支归属含糊 → 包外收敛为唯一一份《更新范围确认单》、取消 9 类包外文件;R1-30:量表报告规范只定义了"报告结构"、没定义"提示词 md 这份产物",且输入源写"量表配置 JSON"与实际 SCALE_DEF 字段对不上(维度→groups、严重程度→scoring.ranges 常空、风险条目→只在 items[].note、适用人群/参考来源→实际没有)→ 立 规范F + check_scale_docs.py;R1-29:同一张报告详情模板承载两类语义不同的报告,却没规定「哪类渲染哪些块」→ B15/D28 补 type 分派;2026-10-08 新增 R1-25:从未按 SkillHub 市场的 frontmatter 规范自查就准备上架;R1-26:references 写死作者本机绝对路径;R1-27:SkillHub 不允许提交字体文件、包内不能带字体二进制 → 立 T0-b + fetch_fonts.py;R1-28:references 声明了从未存在的「外部正本」与 diff 对账流程 → 约束空转,且给"能不能改"提供了错误理由(门槛其实是用户确认,不是正本)→ 全库改口径;R4-16:交付物缺"这页是什么"→ 立 A12 组;R4-17:把"软门禁"当安全措施 → 立 T0;R4-18:官方 upgrade --check-only 缺 config.json 会静默 skip、跑了个寂寞 → 立 T0-c + check_update.py;R4-19:校验范围按"包根一击"写死,scale/ 这类子目录页会整体逃过 L1 → verify_pkg.py 扩围 + 新增资源相对路径检查) |
A / B 通用 | Step 7.5 必读;Step 6 执行前建议过一遍 |
> ✅ 本 skill 的 references 全部是「本地资产」——不存在任何外部正本(用户 2026-10-08 裁定:「以 skill 内这份为准,无外部的规范」)。
> 因此不必再与任何包外文件做 diff 对账;规范A / 规范B / 规范C / 规范D / 规范E / 规范F / 坑清单 / 模板基线清单 / scripts/ 一律以本 skill 内这份为唯一正本。
> 维护方式(按根因分类,见 Step 7 与坑清单):
> · R3 / R4 类(执行手法、校验手段)→ 坑清单 可自动追加;scripts/ 可直接改(属工具维护,不是写记忆);
> · R1 / R2 类(规范缺失歧义、语义错位)→ 产出「建议回写内容」,等用户确认后再改 规范A / 规范B / 规范D / 规范E / 规范F。这不是因为"有外部正本要同步",而是用户级刚性约束:对 skill 内容 / 流程的任何修改都必须先经用户交互确认。
> ⚠️ 旧版本文中若仍有「外部规范副本 / 源头正本 / 回同步正本」的措辞,一律按本行口径理解(已失效)。
assets 索引
| 资产 | 内容 | 适用分支 | 性质 |
|---|---|---|---|
assets/js/timeshift.js(随模板分发于 assets/templates/…/assets/js/) |
时间基准模块:基准日 2026-08-29 + TS()/TS_RANGE()/TS_TODAY()/TS_OP() + 静态 data-ts 填充 + 状态栏实时时钟 |
A / B 通用 | 每页 <head> 必引(规范B §5.4) |
assets/templates/通用型全病程服务包-V3.3/ |
通用型标准模板:46 页 HTML + assets/js/(echarts / chart / xlsx)+ assets/font-awesome/(css + 3 字体),共 58 文件 / 4.2M |
仅 A(通用型) | 只读基线 —— 不得就地修改;一次注入 = 一次复制 |
两种用法:① 基线参照(Step 6.1 差异盘点,用户自带源包时);② 默认源包(用户未提供源包时,cp -R 到输出目录再注入)。
TPL="$HOME/.workbuddy/skills/病种注入器/assets/templates/通用型全病程服务包-V3.3"
diff -rq "$TPL" <源包目录> # 用法①:差异盘点
cp -R "$TPL" "<输出目录>/<目标包名>" # 用法②:作为注入起点
> ⚠️ 模板内不含 .workbuddy/(项目工作区)、标准版产品功能清单/、.DS_Store;这些不属于模板资产。
> ⚠️ 模板更新规范见 references/模板基线-通用型46页.md §4(新版另建目录,不覆盖旧版)。
scripts 索引
| 脚本 | 用途 | 何时跑 |
|---|---|---|
scripts/check_update.py |
T0-c 更新检查:读本地 SKILL.md 版本 + 从锁文件/_meta.json/frontmatter 解析 slug 与 namespace → 查平台 GET /api/v1/skills/{slug}?namespace=… 取 latestVersion.version,与本地按 SemVer 比较;包内若有含 update_url 的 config.json 则并行跑一次官方 skillhub upgrade --check-only 交叉印证。退出码 0=已最新(含"本地高于平台")/ 3=有更新 / 2=检测失败(不阻断);--json / --quiet / --selftest。纯标准库 |
T0 之后、T0-b 之前必跑(每次执行 skill 都跑) |
scripts/detect_source_pkg.py |
入口闸门:按三条判据判定源包类型(通用型 / 病种专属 / 混合 / 不可判定),输出判据原始数据 | Step 0.0 必跑(任何分支) |
⏸️ scripts/scale_doc_extract.py |
量表文档解析(冻结能力,仅按 Step 4.7-附 启用):xlsx/docx 走 zip+XML 纯标准库直读,csv/tsv/txt/md 直读;只如实抽取段落与表格行并给"像题目/像选项"线索,不做语义结论;PDF 只给提示(由模型逐页阅读)。--out 落中间件 JSON、--json/--text/--selftest |
Step 4.7.2 必跑(用户提交量表文档时) |
scripts/scan_residue.py |
分支 B 扫描器:--extract 自动提取候选前序病种词;--terms <三色表> 产出页 × 八类载体残留矩阵 |
Step B2 / Step B3 / Step 6.5 必跑(分支 B) |
scripts/sync_scale.py |
规模口径同步器:从 规范A 实测「行数 / 行表格 / 项数」三项派生值,按明确句式白名单在 SKILL.md + references/*.md 全库同步旧值;默认 dry-run,--apply 才写;另设疑似清单(句式不明的 N 项/N 行)只报告不改 —— 防 R3-11「按句式匹配必然漏」+ 防误伤别的语义数值 |
改完 规范A 后必跑(R3-11) |
scripts/apply_timeshift.py |
时间基准实时化:把包内日期字面量批量包裹 TS()/TS_RANGE()、修 nowStamp()/demoNow()/OP_DATE 锚点、注入 timeshift.js(幂等) |
新建/改造页面后;交付前 |
scripts/fetch_fonts.py |
T0-b 首次运行资源自举:check(0 = 字体齐备 / 2 = 缺)、fetch(下载缺失的 Font Awesome 6.4.0 字体,逐文件 sha256 钉死,幂等、失败重试 3 次、原子落盘)、verify(打印哈希)、strip(上架前删除字体二进制)。源 = cdnjs FA 6.4.0 官方镜像,与原内置文件逐一 sha256 比对一致。纯标准库、无第三方依赖 |
Step 0 之前必跑(铁律 T0-b);上架打包前必跑 strip |
scripts/gate.py |
T0 准入门禁(软门禁):check 静默判定(0 = 已授权 / 2 = 未授权)、unlock <口令> 校验并持久化到本机(~/.workbuddy/.dzq-unlock.json,放在 skill 目录外,SkillHub 更新不会连带删除)、status 看状态、reset 清标记。⚠️ 文件头有性质声明:软门禁不是安全边界(口令校验值在包内、四位数字可穷举、标记是普通文件),不得对外宣称它"安全/加密/防破解" |
Step 0 之前必跑(铁律 T0) |
scripts/verify_pkg.py |
L1 机械层:内联脚本语法 / 真实 DOM div 配平 / 失效链接(不含页数核验 —— A01 已删除) | Step 6.5 与 Step 7.1(任何分支) |
⏸️ scripts/check_scale_docs.py |
量表配套层(冻结能力,仅包内存在 scale/ 时才跑):scale/ 下作答页 ↔ 报告提示词 md 一一对应(C1)+ md 骨架 12 节(C2)/ 8 变量占位符(C3)/ 必含句 R1–R8(C4)/ 五段标题按序(C5)/ 两附在末(C6)/ 示例隔离三件套(C7)/ 同短名(C8)/ 未被外层代码块包裹(C9)/ 篇幅(C10)/ 自包含(C11)/ ranges 为空时的游离分值门槛提示(C12,WARN)/ 事实底稿取自本页(C13)。退出码 0=全过 / 2=有 FAIL;包内无 scale/ 时不适用直过。纯标准库 |
Step 4.7.5 生成后必跑;Step 7.1 量表配套层 |
~~scripts/doc_baseline_diff.py~~ |
⛔ 已删除(★ 2026-10-10)—— 原为「文档基线比对器」(忽略 4 行 + §九 整节逐页比对,产出 SAME/DIFF/MISSING/EXTRA)。用户裁定「不用再将基线文档进行复制平移」后,整套基线比对机制取消,脚本文件已从本 skill 删除(不参与任何流程、不存在于包内) |
— |
scripts/check_docs.py |
L5 文档层 · 文档内质:C1 命名 / C2 八节(★ 2026-10-10:「九、变更记录」已取消)/ C3 功能点编号连续 / C4 与 §3.0 合计一致 / C5 篇幅 / C6 零模拟数据 / C7 占位符 / C8 必备小节 / C9 待收口项含证据 / C10 与事实底稿交叉。--briefs 可选(无底稿工具链时不用传) |
Step 6.7.8 必跑;Step 7.1 L5 |
scripts/review_pkg.py |
L3+L4 规范层与一致性层:真实姓名 / 糖尿病底版残留 / 肛肠底版残留 / 跨页一致性 6 组 / A6 患者端 UI 11 条(含 A6-11 打卡区排序) / A7 医生端 UI 4 条(含 A7-3b) / A8 D 端底栏与全局徽章 4 条(含 A8-1b 视觉口径) / A9 源包解绑 6 条(debind 驱动) / A10 时间基准 3 条 / A11 用药打卡粒度 3 条 / A12 文档产出 6 条(docs 驱动,★ 2026-10-10 收窄) / A13 图标一律 FontAwesome 2 条(A13-1 静态图标位用 emoji / A13-2 裸 emoji 字面量;覆盖三端) / A14 历史卡片统一骨架 5 条(详见 SKILL.md §7.1 明细;基线真源 = 规范B §3.3.3) / A15 F11 Excel 生成量表入口禁令 2 条(★ 2026-10-11;见 SKILL.md §7.1 明细) / 页数 / 配置驱动的旧值·新值·混用检查 / CDN 图标提示 |
Step 7.1 必跑(任何分支,--config <临时>/复核配置.json —— 临时文件,跑完即删) |
python3 scripts/gate.py check # T0 准入门禁(退出码 0 才继续)
python3 scripts/gate.py unlock <口令> # 首次授权(持久化到本机;口令错误 3 次即终止)
python3 scripts/check_update.py # T0-c 更新检查(0=最新 / 3=有更新 / 2=检测失败)
python3 scripts/fetch_fonts.py check # T0-b 字体自举(退出码 0 才继续)
python3 scripts/fetch_fonts.py fetch # 缺字体时补齐(首次运行执行一次即可)
python3 scripts/fetch_fonts.py strip # ★ 上架打包前:删掉字体二进制(打包动作本身须先获用户明确指示,见 T0-d)
python3 scripts/detect_source_pkg.py <源包目录> # Step 0.0 闸门
python3 scripts/scale_doc_extract.py <量表文档> --out <包>/scale/_src/量表解析-x.json # ⏸️ 冻结路径:仅用户主动提交量表文档时(Step 4.7-附 ①)
python3 scripts/scan_residue.py <源包目录> --extract # Step B2 候选词
python3 scripts/scan_residue.py <源包目录> --terms <tmp>/术语三色表.txt # Step B3 残留矩阵(结论进确认单 §8.3)
python3 scripts/verify_pkg.py <服务包目录>
python3 scripts/check_docs.py "<服务包目录>/产品功能清单" # Step 6.7 文档内质(八节)
python3 scripts/review_pkg.py <服务包目录> --config <tmp>/复核配置.json # 临时配置,跑完即删