- 15 Jun, 2026 3 commits
-
-
plan-script/plan-summary orchestrator + plan-aggregate + plan.service 各有一份 逐字节相同的 calcAge → 抽到 packages/utils/src/format.ts(加可选 now 参数便于测试), 4 处改 import。 types/utils build + service/web tsc 通过;jest 103 passed(8 个失败为存量: script-facts 路径失效、priority-scorer.computeLikelihoodBonus 已移除、 plan-engine DB 集成测试、yaml emits — 均与本次改动无关,已 git 核对 cc3eb275 基线)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
packages/utils: 删 daysBetween/addDays/isoNow/hmacSha256/renderTemplate(+连带 DAY_MS、createHmac import) packages/types/canonical-codes: 删 isPACDiagnosisCode/isPACTreatmentCategory/isFDIToothPosition 三个未用 type-guard + RecommendationExtractedBy const/type 别名(保留 Schema) packages/types/enums: 删 SyncResource、PersonaTriggerSource、HostActionKeySchema、AgentKindSchema、RecallFeedbackTag(均零引用;保留各自仍用的 const) pac-service: 删 sync-incremental.scheduler 未用 CronExpression import、wrap-openapi 未用 SUCCESS_ENVELOPE_NAME、realtime-provider 未用 RealtimeProviderKey types/utils build + service/web tsc 全通过。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- 删 modules/agent/(AI Gateway scaffold:AgentService 全 throw NotImplemented、 controller 路由非功能、前端不调、AiGatewayClient 注入从不调用)+ app.module 接线 - 删 pac-web recall-oracle.ts(529 行召回算法影子第二实现,全库零 import) - 删 cli/verify-scenarios.ts(自标 DEPRECATED,读已拆走的 content->treatments, SQL 恒命中 0 行)+ package.json script tsc --noEmit 通过。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 14 Jun, 2026 1 commit
-
-
根因:DW 当天落库晚于 cron(03:30 沪)→ 增量 cohort 拉 0,但 cursor_after 在 finally 里【无条件】推进到 run_start,使 updated_date≤run_start 但落库迟到的行被 永久埋在游标下方(2026-06-14 实测:DW 有 ~3368 行 06-13 变更,03:30 跑却 fetched=0, 游标推进后这批再也捞不回)。 A 空跑不推进:增量 cohort 为空(已含回看仍 0 行)→ 保留上次 ISO 水位、不推进到 run_start,下次增量重试同窗口,DW 落库后即可捞回。 B 回看重叠窗:每次增量查询下界 = 游标 − PAC_INCREMENTAL_LOOKBACK_HOURS(默认 48h), 靠 source_event_id 幂等去重容忍 DW 迟到 / 部分落库;设 0 关闭。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 13 Jun, 2026 2 commits
-
-
容器时区为 UTC,而 @Cron 未指定 timeZone → cron 表达式按 UTC 解释, 导致"凌晨"任务实际 +8h:增量 03:30→11:30、stale-scan 02:00→10:00。 两处补 timeZone: 'Asia/Shanghai'(coverage-monitor 早已正确指定,对齐之)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- 切患者:恢复"开始跟进「XX」"说话框(此动作保留气泡) - 鼠标画圈手势(累计转角>330°+成环+冷却)→ 以画圈处为锚点套绳荡飞 - 边框上想去别层:套绳概率 18%→40% - 蛀虫骑边框概率 40%→60% - 超人模式改按"宠物-蛀虫距离"给概率 min(32%, 4%+dist/2200),越远越易触发 - 牙医组合 idle 轮盘 10%→16% Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 12 Jun, 2026 2 commits
-
-
Q 版磨牙桌宠,挂在 plans/layout(替代原助手 Bot FAB),三层架构: - 感知 pet-events(语义事件 + DirectorScript 受限词表,LLM 接入口) - 大脑 pet-brain(FSM 基线姿态 + idle 动作轮盘:张望/牙线/闪亮/咬合/牙医组合) - 身体 pet-body(程序化 SVG,无外部资产)+ 运动层 pet-locomotion(物理) 动作/物理:重力抛掷·撞墙反弹·任意位栖息(自动发现带边框元素)·走边缘踩空· 爬楼(背朝外悬挂垫脚,可上可下)·动锚点钟摆套绳荡飞(绳端钉实时鼠标)。 互动:摸摸/惊吓/好奇凑近/眼神追随;圈选文字 → 走过去+爬楼+放大镜照+爬下楼。 组合派生:牙医诊疗(检查→洗牙/补牙/终止→抛光/涂氟护盾/终止→收尾,概率分叉)。 NPC:蛀牙菌(地板/边框两种 lane,追/逃/敲爆;隐藏 10% 超人模式:变身→直飞秒杀)。 仪式:坐稳卡片刷牙→闪亮→漱口→涂氟护盾。5 分钟无操作打盹。 LLM:新增 POST /pac/v1/assistant/pet-say(SSE,无工具,≤30 字流式), 前端 use-pet-voice 仅页面激活 + 低概率 + 4min 冷却时观察环境说一句(唯一带气泡的动作); 其余动作全为纯动作/道具,不出说话框。 /pet-lab 为动作陈列 + 触发调试页(dev 用)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
runAllForHost 的 close-orphan 此前只关 status='active',assigned 不动;而 upsertPlan 注释 + closeStaleActivePlan 定向路径已是"缺口全消失即关、assigned 也关"(2026-06 决策)。 批量路径漏改 → 已认领的误召计划在算法修复后仍残留旧理由,客服按错信息跟进 (本次部署实测:李姝妤外院/余奕铭无意愿/祁小夏固定桥 排除已生效但 claimed 计划没退役)。 改:批量扫 status IN ('active','assigned'),不在本轮 hitsByPatient 的一并 supersede。 in-pool 的 assigned 不误关(其患者在 hitsByPatient 被跳过,理由已由 upsert 刷新+继承认领)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed
-
- 11 Jun, 2026 32 commits
-
-
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
扫描器独立重实现召回逻辑,不补会把新排除误报成"真·无法解释 FN"。 - 拆线→surgical、ICD K00→K08:数据层改动,reparse 后扫描器自动读到,无需改 SQL; - 固定桥/检查文本/无意愿/外院:补 vt_bridge / vt_norestor / vt_refusal / vt_external 四张解释表,接入 §C3/§C4/§C6 归因桶(7a/7b/7c/7d、3b)。 本地 21 人跑通无错,新桶正确归类(7a 固定桥 3、7b 检查文本 3)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
- 全部 tab 下线(召回池+我的足够日常);view='all' 逻辑保留备用。 - 病历快读 Drawer 原 z-40 低于左栏 rail(z-50)→ 抽屉打开时 rail 穿透盖在上面。 提到 z-[60] 高于 rail。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
只认"外院"会漏:他院/别院/别的医院/其他医院/换了医院(14+ 真案例,如"已在别院做了 活动牙""在别的医院做矫正了")。 - POS:院字同义词与治疗词【双向紧邻 ≤3 字】,只认实质治疗(治疗/种植/矫正/修复/根管/ 补牙/做了/做过),不含复查/洁牙/检查; - NEG:扩"会去/要去/咨询了/不考虑…院"意图,标点边界保护多子句真阳; - 纯"已治疗"不带院字(111 条)不收 —— 可能指本院(本院治疗由 treatment_record 处理)。 全库 POS∧¬NEG 851→977 患者;李姝妤仍排除,21 人理由 41 不变(零回退)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
原规则 result||follow_content + "外院"+任意治疗词太宽,两类干扰: - follow_content 含营销标签"种植潜客/洁牙/正畸"→ 与 result 的"外院"误拼命中 (种植潜客=潜在客户没做,反该召); - "建议/打算/考虑…外院"(意图未去)被当成已治疗。 收紧(全库验证): - 只 match patient_return_visits.result(弃 follow_content); - POS=治疗词紧邻外院:外院(治疗|种植|矫正|矫治|修复|根管)|在外院|外院已|已外院; - NEG=排意图:(建议|打算|考虑|可能|拟)[^,;。]{0,6}外院。 POS∧¬NEG 命中 851 患者(原 1812 含大量噪音);被剔除的全是"打算/考虑外院"假阳。 验证:李姝妤仍正确排除,21 人理由 41 不变(无回退无新误杀);recompute exit=0。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
李姝妤 BJ0U005102:回访 4.21"已在外院矫正中",召回正畸(诊断 1.26)误召。 口径(与产品对齐): - 不影响已治疗事实/数据流 —— gap 算法只读 patient_return_visits(展示表),不写 fact; - 患者级排除(不看牙位/类目); - 时间方向:回访日(外院治疗时点)须 ≥ 本次诊断 → 新诊断更晚则不排(重新可召); - 信号 = "外院" + 治疗词共现(EXTERNAL_TREATMENT_VISIT_PATTERNS:治疗/种植/矫正/矫治/ 修复/根管/已治/做了),排除"外院洁牙/检查"低值噪音。 gapWhere 加 externalTreatmentGate(NOT EXISTS 回访记录命中且 task_date≥诊断)。 验证:李姝妤正畸召回消失(42→41,零误杀);recompute exit=0。全库回访含外院 1812 患者。 仅本地,未部署。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
关平 BJ0U007377 牙25:残根拔除后缺失,宿主把"牙齿缺少"标 std_code K00(=牙发育/ 萌出障碍)→ 误召"萌出异常未处置"。全库 1044 例同类错标。 区分符=「先天」:K00 真覆盖先天缺牙(462 例,发育障碍)+ 萌出/多生牙;后天缺失的 "牙齿缺少/缺失/缺牙"被错标 → 应 K08。 - types reconcileDiagnosisCode(code,name):code=K00 且 name 含缺(牙/失/少)且无"先天" → K08;其余 K00 不动(单一源,与 K07.303→K03 同类纠偏); - diagnosis.parser 落码前调用纠偏。 验证(本地重摄 21 人):关平25 K00→K08,召回从"萌出异常"(66)改判"缺失牙未修复" (81,正确);21 人里 9 条诊断纠偏;前四类修复回归全保留。需 reparse 存量诊断。 仅本地,未部署。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
余奕铭 BJ0F022277:1.18 三条 planned 治疗 subtype"正畸取资料/洁牙,患者无意愿" → 当场拒绝;召回正畸83+牙周62 正是被拒两项 → 误召。 口径(与产品对齐):类目级 + 对本次诊断排除(非永久非时效)——与"治疗已启动"对称, 靠时间方向;新诊断更晚 → 自动重新可召。 - types 词典 TREATMENT_REFUSAL_SUBTYPE_PATTERNS(无意愿/不愿/拒绝); - gap 全口分支(K05/K07)NOT EXISTS 加拒绝;按牙分支 resolved 加拒绝(种植/修复类); - planned 记录用 COALESCE(occurred_at, planned_for) 取时间。 验证:余奕铭正畸/牙周召回消失(44→42);其余 6 正畸+1 牙周召回全保留(零误杀); recompute exit=0。全库 1225 患者有此信号。仅本地,未部署。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
李强 BJ0U017401 牙36;46:检查"缺失,与邻牙间隙不足"(缺牙十年邻牙倾倒)→ 直接种植 修复无空间,临床需先正畸 → 推"快去修复"的召回是错的(一线"建议正畸"同此判断)。 "间隙不足"归入 NO_RESTORATION_GAP_EXAM_PATTERNS(三处消费方共用:后端 gap/对账 oracle/ 牙位事实视图,一词全生效)。共现"缺牙"护栏挡掉正畸拥挤语境(全库 844 段间隙不足仅 246 段共现缺牙,均真·缺牙无空间)。 验证:李强 36;46 缺牙召回消失,牙体损伤/龋齿真实项保留;21 人理由 45→44 净减一条 (无误杀);recompute exit=0。仅本地,未部署。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
牙位事实(tooth-timeline)是原始事实流,不展示 exam_findings → 26 这类'缺牙但间隙 关闭无需修复'看着像未处理。补:从 facts 解析 exam_findings,'缺牙+间隙关闭/无修复 间隙'的牙位在泳道末尾加灰色'非修复'行+检查原文。同后端 gap/前端 oracle 词典口径。 web build 过。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
后端 gap (a''') 用 exam_findings'缺牙间隙关闭/无修复间隙'排除该牙;前端对账 oracle 镜像同口径(词典 NO_RESTORATION_GAP_EXAM_PATTERNS),否则审计视图报假分歧。 判 ineligible(非修复),理由'检查所见缺牙间隙已关闭'。web build 过。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
王敏 BJ0U017412 牙26:诊断只写"牙列缺损",但 emr_record.exam_findings 写 "缺失,缺牙间隙已关闭"→ 间隙没了无需修复,召回看不到检查文本 → 误召。 方案A(不升 examine 为主体,排除时读 fact.content): - gap 核心 resolvedTeethSql 加分支:解析 emr_record.exam_findings(JSON 字符串数组), 牙位 message 中"缺失/缺牙"与"间隙关闭/无修复间隙"同段共现 → 该牙计入已解决; - 词典 NO_RESTORATION_GAP_EXAM_PATTERNS 放 types 单一源(与同语义的 RESTORATION_INELIGIBLE_DX_NAMES 并列);共现限定排除正畸"关闭间隙"治疗噪音 (单独"间隙关闭"全库多在正畸语境;共现后 104 患者命中); - 时间方向与治疗家族同口径(afterDxFor('emrx'))。 验证(21 人本地):王敏 26 移除、37;47 真缺牙保留;总理由数 45 不变(零误杀); recompute exit=0。Layer C 上线后此分支平移给抽取器即可。仅本地,未部署。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
桥的治疗记录牙位只写基牙(④ 31;41 缺失由 32;33;42;43 基牙桥修复,treat 名 "冠修复(美学区)"无"桥"字),桥体悬住的缺失牙不在牙位里 → 重叠判定失败 → 误召。 修复(gap 核心 resolvedTeethSql 加 (a'') 桥区间分支): - prosthodontic actual 且同一牙弓 ≥2 颗 → FDI 转弓位线性序(上颌 18..11|21..28, 下颌 48..41|31..38),基牙跨度区间内全部牙位计入 resolved; - 不依赖 subtype 含"桥"(实测桥的 treat 名不带桥字):连续多冠跨度=颗数,填洞为 空操作无副作用;跨度>颗数(夹缺牙)即桥语义; - 时间方向与治疗家族同口径(afterDxFor 别名化复用)。 已知取舍:缺牙两侧各做独立单冠且未做桥的罕见场景会被误销,接受。 验证(21 人本地基线 diff):④ 31;41、⑯ 36 召回消失;其余 45 条理由零变动(零误杀); recompute exit=0。仅本地,未部署。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
拆线是治疗动作,原被 manifest route 分流到 review(流程类)不算治疗 → 术后复诊日 EMR 复述缺失诊断时,同日拆线无法证明"已启动" → 误召(李然47/韩俊和26;27)。 根源改法(替代先前 gap 侧特例,特例已撤销): - manifest route 两处移出"拆线" → 走治疗路径; - treatment_actual.yaml 加映射 拆线: surgical("种植拆线"原已映 implant); - surgical ∈ 结构家族 resolver(STRUCTURAL_RESOLVER_CATEGORIES)→ K08 排除自然 生效,gap/types 零改动(已回退到原状)。 本地验证(清库后仅摄 21 个一线反馈患者,PAC_COHORT_ONLY_PATIENT): - 拆线 facts category=surgical ✓ - ① 李然 47 缺失召回消失(剩 16 牙体损伤/17;38 龋,真实待治)✓ - ⑪ 韩俊和(2.3 种植 2.12 戴牙)26;27 种植召回自动消失 — 泛化得证 ✓ 核验文档精简重写(每例一行)。仅本地;部署时服务器需 reparse 存量拆线行。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
口径(与产品对齐):诊断信号保真,新诊断必然参与召回判定,不动; 缺口在治疗证据侧 — 光杆"拆线"落 review 类不算治疗("种植拆线"在 assembler 已映 implant,同动作两种录法),术后复诊日 EMR 又录了缺失诊断 → 同日拆线无法证明 "已启动" → 误召(李然 BA38586 牙47,92 分被认领)。 review 类全量盘点后只放行【术后护理】两项(铁证:该牙做过手术/种植): 拆线(带牙位 3672 条)/ 种植复查(739 条) 不放行:暂观/观察/暂观必要时拔除(明确未治疗,恰是召回对象)、泛复查/流程项。 实现:types 加 GAP_POSTOP_CARE_REVIEW_PATTERNS 单一源;gap 核心 resolvedTeethSql 加 (a') 术后护理分支(时间方向与治疗家族同口径);fact 层不动(chain S4 保留); 召回+画像共用同步生效。时间方向片段重构为 afterDxFor(alias)。 验证:服务器只读 李然47 新分支=t;本地全量 recompute-plans exit=0 零错; 影响面:带牙位术后护理记录覆盖 3,338 患者。 (此前"黄金窗回看"方案已 revert — 会压住治疗后窗内的真新诊断,口径不如本方案干净) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
上个 commit 验证结论有误(管道 tail 吞了退出码,实际 SQL 报错)。本次修正后重验: recompute-plans 全量 exit=0;recompute-persona 单患者(共用 gap 核心)success=1。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
一线反馈①(李然 BA38586 牙47):1/25 种植 actual 已入库,2/7 拆线复诊 EMR 惯性复述 "牙齿缺少47"→ 最新诊断晚于治疗 13 天 → 时间方向判"未启动"→ 误召(92分被认领)。 根因模式:EMR 复述诊断 re-arm — 术后复诊把历史诊断再录一遍(录入惯性非新发现), "复活"已启动治疗的 gap;任何术后复诊都可能触发,非个例。 修复(gap 核心单一源,召回+画像同步生效): 治疗 ≥ 诊断日 → 治疗 ≥ 诊断日 − 黄金窗(rule.windowDays,K08=180天) - 复述(治疗后黄金窗内再录同码)= 同一治疗 episode,不 re-arm; - 真复发(末次治疗距再诊断超黄金窗)照常召回; - 取舍:治疗后窗内"真二次新发"延后到下次诊断 — 该场景临床通常当场处理。 验证:服务器只读对照(李然47 新谓词 t / 旧谓词 f);本地全量 plan 重算无错。 新增 docs/algorithm/frontline-feedback-verification.md 逐条记录 21 例核验(①完结,②-㉑待核)。 仅本地,未部署。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
根因(2026-06-11 哨兵空转告警,服务器 DW 逐行核验): 增量 cohort 列患者只查 patient_list_from.last_visit_time > cursor(=近期来过诊的人), 漏掉"没来就诊但数据有变"的患者 — 典型即 PAC 自身业务闭环:客服电话约复诊(预约 updated_date 变了,人没来)、医生回头补写病历。当日 24 行预约 + 3 行 EMR 超游标, 27/27 全属此类患者(去重 22 人,老口径列出 0 人);且等患者到诊时游标已越过这些行 → 永久漏数。 修复:增量模式下列患者 = 每张配了 cursor 的源表按各自游标取变更行患者,UNION ALL 去重(manifest 驱动,FROM 主表正则提取,不写死表名;宿主无关)。 - 全量/无游标首跑:保持原 patient_list_from 行为不变; - 采样 LIMIT 的 list_cursor_column 排序在 union 模式回退按 patient key(仅 dev 用); - refund 分支与 settlement 同表重复,DISTINCT 吃掉,无害。 验证(只读):服务器 DW 实跑新 union SQL → 22 患者全部捞回;service tsc 0。 仅本地修复,未部署(待统一打包)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
标签质量运营第一道防线:规则标签会静默腐烂(上游字段改名/枚举漂移/断供时悄悄变空)。 - 每天北京 08:00(增量+重算之后)按租户算 16 标签覆盖人数/占比,对比 24h 前; - "昨天覆盖率"从画像版本流(computed_at/superseded_at)直接反推 — 零快照表零迁移; - 显著下跌(相对 ≥10% 且绝对 ≥20 人)→ warning 并在标题点名,平时 info 日报; - 走现有 AlertService(企微 webhook);PAC_COVERAGE_CRON 可调。 验证:本地库 SQL 实跑(16 标签覆盖与设计样本一致,24h 反推出数); 真实格式日报已发企微测试 errcode=0。service tsc 0。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
- referral_champion 读 DW recommend_num/amount 全史累计计数器(单调只增)→ lifetime (纯声明字段修正,不影响计算逻辑);提取器头注释同步。 - acquisition_channel 注明"实为 static(不变历史定格),退化场景归 snapshot"。 - 速览文档补 snapshot vs lifetime 判别准则:分界看值的演化方向(lifetime 只增不减 / snapshot 可逆可变),非评估时点;并注明 entitlement_status 是"曾有"非"现有"。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
现代清爽审美的常见做法:保留 1px 边框但压到极低对比(~6%),靠 bg 明度差+阴影分区。 全局 21 处 border-slate-200 统一软化为 slate-100,结构/阴影/间距/标签/文字一律不动。 web tsc 0。仅本地,未部署。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-