- 07 Jun, 2026 20 commits
-
-
- 新建 modules/clinical-gap/potential-treatment-gap.sql.ts:toothArrSql + buildGapCore (sig 牙位/resolved/remaining 相减 + ⑤a 判定 + 废用牙/先天剔除 + §E flag),Layer 1 facts 消费层(中立)。 - §E gap flag 单一真理源 GAP_FLAGS_BY_PRIMARY(召回 SUB_SCENARIOS 不再内联)。 - 召回 scenario 改 import 共享片段,SQL 逻辑零改动只搬家。 -
✅ 字节等价验证:新旧码召回集合 EXCEPT 双向 0 diff(本地 928,1450 条全等)。 - 目的:Layer 2 潜在治疗画像将复用同一 gap 核心(避免 Layer 2→3 倒置 + 口径漂移)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- 总览表加 治疗敏感 / 禁忌标签;13→15 标签;多标签 + 稀疏 + 未完整实现(Layer C)说明。 - 审查发现 +2:treatment_sensitivity 关键词精炼排假阳;contraindication 不上规则版(否定泛滥/ 量化无数据/需临床判断 → 仅种植年龄,余留 Layer C)。 - follow-up 加 Layer C(LLM)层标签:禁忌完整版/沟通偏好/意向/家庭社交。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- contraindication 多标签结构(种植/正畸/麻醉/手术禁忌)。v1 仅实现【种植年龄禁忌:年龄≤18, 骨骼发育未完全】,validUntil=满19岁自动解除(到期重算即不打)。 -
⚠ ️ 其余禁忌不上规则版(会医疗事故):既往史'过敏'97%是'否认过敏'(否定泛滥)、HbA1c全量仅10条 (量化条件无数据)、需控制状态/急性期判断 → 留 Layer C(LLM 抽取)。data 结构已留多标签位。 - 本地 928:种植禁忌 167,validUntil 正确,交叉验证 age_bracket≤18 一致。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- treatment_sensitivity 多标签:看牙恐惧/晕针/晕血/密闭恐惧。扫 emr_record.content (past_history 既往史/illness_desc/pre_illness/disposal 等)+ profile.notes/tags。 -
⭐ 关键词按全量数据排查精炼:看牙恐惧 恐惧/害怕看牙/牙科焦虑/看牙紧张(❌ 裸紧张=颏肌紧张); 晕针;晕血/见血不适(❌ 裸见血=可见血凝块);幽闭/密闭/长时间张口不适(❌ 裸张口受限=物理受限)。 - 宿主未给 health_profile;EMR 既往史已承载(晕针病史等)。无迁移/无重摄。 - 本地 928:看牙恐惧 2(全量约 177 患者 0.13%,低覆盖高价值安全标记)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
旧版停在早期设计(RFM几何八象限/简化lifecycle/圈人群),跟最终实现对不上。 重写为:画像层定位 + persona schema + 4 数据范式 + 时间语义 + Feature Registry(指向 persona-feature-specs.ts 单一源)+ 13 标签总览表 + 算法审查发现/口径决策(RFM图口径/ lifecycle顺序bug/discount金额非比率/TZ/no_show不在active等)+ follow-up + 部署清单。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- special_attention 多标签:屡次爽约(近1年履约率<50%且决定≥3)/经常迟到(到店>预约+15min≥50% 且≥3)/免打扰(doNotContact)/不可等候(notes/tags/病历关键词)。 -
⚠ ️ 挖出 2 个真问题并处理: ① no_show/cancelled 预约 patient_facts.status≠active/fulfilled,不在 persona ctx → 新增 ctx.appointmentsAll(单独加载全状态预约,排 superseded)给爽约/迟到用。 ② arrived_at(in_time)摄入 TZ bug:比 planned_for 一致早 8h → +8h 补偿(根治修摄入,follow-up)。 - 本地 928:经常迟到86/屡次爽约2(免打扰/不可等候样本无数据,全量会出)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- DW 无 original_amount;discount_*_rate 实为折扣金额(应收3-dept0.45=实收2.55)→ 折扣率=1-Σ折扣/应收。摄入 payment_record.content.discount_cents + settlement_project(重摄)。 - discount_anchor:取真实治疗最深【部分】折扣 + 日期/项目。 -
⚠ ️ 修 spec 两个 naive 点:① 免费洁牙/检查促销(100%off=0折)会霸占锚点→只看原价≥¥500+ratio>0; ② 保险方付款非诊所折扣→排除 discount_insurance_rate(只算科室/公司/卡)。 - 本地 338 患者:avg 6.4折,样例合理(种植9.4折/修复/促销2.9-5.1折)。 -⚠ ️ 留口径:近免费(>90%off)comp/全保 是否算锚点;¥500 阈值可调。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- time_preference 多标签:工作日/周末/上午/下午/晚间偏好。近2年预约,北京 TZ。 -
⭐ 数据排查:occurred_at 钟点被搞乱(时区/解析,16-23 乱分布),planned_for +8 才是 干净营业钟形(8-18 峰 9-15)→ 用 planned_for。无新摄入/无迁移。 - 阈值照 spec:工作日≥60%/周末≥50%/各时段≥50%,记录≥2;无命中→不打标签。 - 注册表 spec/enum/label。本地 601 患者:下午368/工作日305/上午289/周末289。 -⚠ ️ follow-up:appointment occurred_at 钟点不可靠(latent bug);TZ 硬编北京,多宿主应读 host TZ。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- treatment_history 多标签:implant→种植史/orthodontic→正畸史/prosthodontic·cosmetic→修复史/ periodontic→牙周治疗史。不标记 surgical/restorative/endodontic 等基础治疗。 -
⭐ spec 用病历/结算关键词匹配(数仓原始文本);PAC canonical 层已归一成 category → 直接读,无关键词/无新摄入/无迁移。canonical 层价值体现。 - 注册表 spec/enum/label。本地 773 患者:牙周596/修复195/正畸165/种植120,多标签生效。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- lifecycle_stage 7 阶段(潜客/新客/成长/成熟/待激活/沉睡/流失)。PAC 自算: net_receipts_total/total_visit_times 源表(fact_client_out)没有 → 从 payment/就诊 fact 算 (同 RFM 口径);潜客用 appointment fact。无新摄入/无迁移。 -
⚠ ️ 修正 spec 顺序 bug:原'沉睡>540'在'流失>730'前→流失永不触发;流失提前到沉睡前。 本地验证:末诊1913天/23次患者正确判流失(原顺序会误判沉睡)。 - 移除 rfm.data 里的简化 lifecycle(避免与本特征重复;生命周期归本特征单一来源)。 - 注册表 spec/enum/label。本地:成熟614/新客207/成长104/待激活2/流失1。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- 摄入 fact_settlement_mode_out.card_type_name/card_name → payment_record.content (payment.parser + schema + payment.yaml;String() 强转防数字型卡券值炸 .trim)。 - entitlement_status 重写:遍历结算卡券/保司/channel 关键词多标签(允许并列): 高端保险直付/银行私行权益/储值会员/儿牙会员/医保客户;未命中→不打标签。 - 注册表 spec(v2)。本地 928:医保225/银行私行175/儿牙35/储值27/高端保险17(274 患者有权益)。 - 无 schema migration(卡券名落 content JSONB);需重摄 payment facts。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- 摄入 fact_client_out.recommend_num/recommend_amount → 副表立柱 referral_count/referral_amount_cents (元→分;canonical schema + patient.yaml + cold-import/dispatcher 两路 upsert + migration)。 - referral_champion 特征:门槛 recommend_num≥3 且转化额>0;直系家庭≥3→家庭型,否则社交型;不满足→不打标签。 - 本地 928:26 社交型(家庭型需≥3直系家庭,样本稀疏未出)。 -
⚠ ️ v1 用 DW 预聚合替代逐个被推荐人'均有效转化'(跨患者+需被推荐人已摄入,留 v2)。 -⚠ ️ recommend_num 增量刷新滞后(fact_client_out 游标=last_visit_time,无 updated_date): 推荐人下次到诊/全量重摄才更新;真修=游标改 greatest(last_visit_time,recommend_last_visit_time)(follow-up)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- 复用 PAC PatientRelation 边表(无迁移/无重摄):relations 注入 persona ctx, family_structure extractor 反推直系亲属结构。 - 直系 spouse/child·grandchild/father·mother·grandparent;sibling/friend/other 噪音不计。 有长辈→多代/有子女→多口/有配偶→两口/有非直系边→单身/无边→不打标签(数据缺不臆断)。 - 注册表 spec/enum/label。本地 85/928:多口28/多代21/两口19/单身17。
⚠ ️ 覆盖依赖关系边,样本稀疏+非全量偏低;多代采广义(有长辈即跨代)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- DW fact_client_out.primary_category/sub_category(L2 初诊来源)→ 摄入 PAC 副表 patient_profiles.acquisition_channel(PAC立柱标准枚举)/acquisition_sub(host原值)。 - 链路:canonical-codes.PACAcquisitionChannels(单一收口)+ patient.yaml enum_mapping(走入→walk_in 等) + PatientCanonicalSchema + 两条 upsert 路径(cold-import 全量 / dispatcher 增量)+ migration(2列+索引)。 - acquisition_channel persona 特征(snapshot,读副表立柱出标签)+ 注册表 spec/enum/label。 - 本地重摄 928:口碑331/走入162/集团营销158/地区营销157/电商65/集团销售53/自媒体2,特征100%覆盖。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
gender extractor:patient.gender 映射 M/男→男性、F/女→女性、其他→未知(照图,三值)。 注册表 spec + enum/label;来源可切(现 patient.gender,宿主给 client_gender 后切)。 本地 928:女 468 / 男 460,画像现役 5 特征(rfm/age_bracket/gender/dnc/entitlement)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- age_bracket extractor:从 patient.birthDate 算周岁 → 9 档(婴幼儿..老年),照图区间; 3/55 重叠按'下界含、归下一档'+ ≥55→老年消歧。snapshot 时间语义(历史读版本流)。 - 注册表 spec(标签卡)+ enum/label;数据来源可切(现 birthDate 自算,宿主给 client_age 后切)。 - birthDate 缺失/年龄越界(<0/>120 脏数据)→ 不打标签。 - 本地 928 验证:分布合理、边界消歧正确、覆盖率 100%。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- treatment-initiation-recall.fetchPersonaContext:改读 rfm.data(valueTier/riskScore), rfm 缺失优雅回退旧字段。本地 1437/1437 plan 打分零变化 → 翻转行为等价。 - FeatureRegistry/persona.module:摘除 value/recall_risk/treatment_chain_status 三个 extractor (treatment_chain 降级为详情页 episode 视图,后续单做);现役 rfm/dnc/entitlement。 - rfm 决策树补全:develop 档 F=2 扩 F<3(近期单次新客→一般发展,不误落低活跃)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- rfm.feature 改为业务整理好的 RFM 定义:R/F 分段照图、M 按租户分位(p20/40/60/80)、 8 段决策树(重要价值..低活跃)。R/F/M = last_visit_time/visit_times/net_receipts_total(lifetime)。 - M 分位需群体计算:PersonaService 算+缓存租户分位阈值(30min TTL),注入 ctx.populationStats; 缺失降级绝对¥档。valueTier(绝对¥)/riskScore 保留 → 仍 100% 兼容旧 value/recall_risk。 - 新增 persona-feature-specs.ts:标签注册表(标签值/数据来源/数据字段/释义/算法/时间语义), 代码存、来源可切(现 PAC 自算,宿主 CDP 报表给出后切宿主值)。score 列弃用语义。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- 新增 rfm feature(融合 R最近/F频次/M金额三时间语义):data 带 segment 八象限 + lifecycle 生命周期 + valueTier(0-4)/riskScore(0-3)。统一旧 value+recall_risk。 - additive 接入(暂不动 scorer/旧特征);本地 928 验证:分布临床合理,且 valueTier/riskScore 100% 复现旧 value.score/recall_risk.score → 后续翻转零风险。 - recompute-persona 加 --force:算法/特征变更后(数据没变)跳过水位幂等闸强制重算 (部署到服务器也需要,否则全 noop)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
画像从'被动打分+话术标签'升级为有治理、有时间语义、可圈人群的特征体系: - 时间语义模型(snapshot/window/lifetime/trend,每特征声明;画像=压缩当前态,历史留fact层,版本流=point-in-time) - Feature Registry 单一收口(OneModel)+ CI 防漂移 - persona_features 加 typed value JSONB(支持 SQL 圈人群) - RFM 八象限(统一现有 value+risk:M→value,R+F→lifecycle/risk)+ 召回语义映射 - lifecycle_stage 生命周期分层;treatment_chain 移出画像→episode 视图 - Campaign 圈人群→批量召回;质量监控;分 5 PR 实施 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 06 Jun, 2026 12 commits
-
-
- parseScriptMarkdownToSections 改通用 H2 解析:原只认稳健 4 固定标题(开场白/...), 深度/标准的自由标题反 parse 全落空 → plan_scripts 存了内容但刷新显示'尚未生成'。 现按任意 ## 标题切段(稳健固定标题映射已知 id,标准/深度自由标题用 s{n}+原标题),三档通用。 - KeyFactsCard 主治医生:影像AI(image_ai 触发诊断)不当主治医生显示,退回真实最高频医生 (排除影像AI/image_ai),真无人类医生 → '—'。话术侧 extractPrimaryDoctor 本就排除,一致。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
§E 三条剔除(已落地 scenario)之前会被扫描器虚报成 truly_unexplained;补 x_thirdmolar/ x_congenital/x_orthoextract 三 flag,FN 按首个命中归桶,truly_unexplained 才准。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
仅 missing_tooth 子场景加 3 条剔除: - excludeThirdMolar:智齿位 18/28/38/48 不召种植 - excludeOrthoExtractionSites:该牙有外科拔除 + 患者正畸语境(K07/正畸治疗)= 正畸减数位, 缝隙靠矫治关闭,不种植(折进 resolvedTeeth 按牙减,忽略时间方向:拔在 K08 诊断前也算) - excludeCongenitalName:name 含'先天'(先天缺失等)→ 正畸统筹开/关隙,不自动召修复 本地验证:智齿位 active 召回 2→0,3573063 '38;46'→'46'(精准保留真磨牙),无过度抑制(FP 仍1)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- treatment-initiation-recall:excludeIfEverTreated(K05牙周/K07正畸)从"曾做过即永久排除" 改为"治疗须晚于该病【最新诊断】才算已处理"。最新诊断在末次治疗之后(复发未治)→ 重新召回; 维护中患者(末次治疗≥最新诊断)继续排除,活跃患者仍由 cooldown/⑤b/⑤d/⑤f 兜住。 仅改两段时间方向 fragment + 加 latestDxOfCode 子查询。 本地 1000 患者验证:复发漏召 27→6(残留全是 cooldown内/已指派锁/⑤d 合法不召),牙位级 FP 无回归。 - 新增 sql/verify-recall.sql:只读召回正确性扫描器(FP 硬闸 + 牙位交叉表 + FN 逐层解释 + 全口复发 + K08正畸语境),每次摄入/改算法后跑做回归。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- 数据:data/jvs-dw/users.json — 116 位在岗客服(回访表口径·近12月), 结构 = 未来 users/user_clinics 两表形状(externalId/name/tenant/roles/clinics) - 后端:mock-users.ts 加载器(cwd 解析+缓存);mockLogin 支持 userExternalId (选具体客服→sub=externalId/真实姓名/该客服诊所);新增 GET /auth/mock-users - 前端:快速登录改为「角色(权限)+ 选客服」合并式;名册拉不到时降级回通用网格 - 前端:列表页诊所筛选选项改用 user.clinicIds(RBAC 可见范围),名取 dictionary (原误用全 tenant 名表,与后端 scope.clinicIds 过滤对齐) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- RegenBtn:[档位▾][模型▾][重新生成] —— 两下拉只选不触发,重新生成移右为唯一触发口。 - 原文视图:默认展开语义(只记主动折叠)→ 流式时新段(s0/s1…)也展开,不再折叠。 - loading 骨架分档:稳健 4 段固定标题 / 标准 4 段无标题 / 深度 1 段(段数不定)。 - AIStamp 精简(去图标+label,只留相对时间)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
标准档:4 固定角色字段 → 自由 sections[](固定4段,复用 DeepDraft + 段渲染 + 段数组安全规则);format.md 去 tier 污染纯指令;流式(段数组 partial 边渲染)。 深度档:富输入 base++ — 历史联系(patient_return_visits 最近5条)+ persona 价值/流失风险, 经 buildDeepExtensions 进 plan/write/verify;plan 放开结构(去固定段式、允许其他牙开段); verify 加 quality 质量评分(1-5,非 gate,回填 judgeScore/judgeRubric 供 eval);format 去污染。 治疗计划:ScriptMedicalRecord.plannedTreatments(treatment_record planned)— 原只读常空的 emr.treatment_plan 导致话术缺治疗计划;stable/standard 渲染;standard 病历补全到全 SOAP。 tone 收拢:shared/tone.ts 单一源(枚举/describe/label);选择规则只留人群 SKILL(system), user prompt 只给信号(熟络度),模型判断。占位:去模板档去 {} 替换占位,只留【时间段】人工填。 资深审查修复: - P0 SSE 客户端断连无清理 → AbortController 串到底(controller→orchestrator→runner→ generateObject/streamObject abortSignal):断连即取消在途 LLM(深度3-4步不再白烧), abort 不兜底/不写 PlanScript。实测:深度 6s 掐断仅 +1 条 aborted、PlanScript 未脏。 - P1 深度质量分回填到最终 invocation(原挂被丢弃的草稿);深度非流式 cacheHit 真实累计 (原硬编码 false);extractPrimaryDoctor 注释更正;skill-registry 陈旧 env 名更正。 两端 tsc 通过;三档 dry-run + 流式 + 中断 均验证。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
workspace.json 等每次开 Obsidian 都变动,反复污染 git status。 untrack 整个 docs/.obsidian/(本地文件保留)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
NEXT_PUBLIC_API_BASE_URL 是构建期 inline。若 docker compose build 漏带 --env-file apps/pac-web/.env,`${NEXT_PUBLIC_API_BASE_URL}` 插值成空串; env.ts 原用 `??` 只挡 undefined 挡不住空串 → `new URL(path,'')` 抛 "Failed to construct 'URL': Invalid base URL",登录页直接报错。 改:空/缺失时浏览器端退到同源(prod 反代下 API 与前端同域,天然正确), SSR 退本地默认。即便构建注入失配,生产也不再硬崩。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
system/user 提示词系统性打磨 + 单一源收口(三档共用): - PII 收口:称呼派生(callSalutation/pickGuardian/nameSpokenForm)从 orchestrator 归到 shared/pii.ts(与 deidentifyDoctor 同处,人名/称呼单一源);script-facts.ts 退化为纯确定性渲染(smartDateDisplay + fdiToFriendly/toothFriendly),删死函数 resolveSalutation/resolveAgeBranch/resolveAgeGroup。 - common.md:角色=要点提纲非照念;铁律收口(接地不编 first / 突出本次应治未治项 / 医生名义 / 钱与方案软化"可点名不报价落点复查" / ≤18 禁拍片 / 主动约 / 口语短句), 去反向示例词。 - population adult/child SKILL.md:瘦身去重,语气改"熟络度"(recency 为主+次数为辅, 交 LLM 判断,去掉"新老客"二分退化标签)。 - fact-block(标准/深度共用):开场锚定最近一次就诊(非诊断日);熟络度 relationSignal; recentTreatments 结构化"用自己的话自然带";renderMedicalRecord。 - fdiToFriendly 补乳牙象限+字母记法(1A-4E),修儿童龋齿"1D/1E"原样泄漏给患者。 - 开场 bug 修:从 triggerDate(诊断日,可能更早)改为最近一次就诊;"检查后"→"来过之后"。 - stable tier:prompt/schema/phrasing/stable.call/format.md 配套(目标 + 牙位占位 + 医嘱/建议/治疗计划 + ≤18 belt;预约不成功措辞软化);儿童模板第二部分改病种无关。 - deep tier calls / standard.call:版本对齐。 本地 tsc + build 通过;CLI dry-run 多档重生验证称呼/开场/牙位/熟络度均正确。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 05 Jun, 2026 8 commits
-
-
- RegenBtn 加投入档下拉(与模型下拉并列):稳健/标准/深度,选档即用该档重新生成 - tier 走 /script:stream ?tier= query;ServerSection.id → string 支持深度档多段不定渲染 - 详情页暂隐藏实时教练入口(功能未上线;import + 挂载注释) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
目录重组:shared/(脊柱周边 + 病种名/安全单一源 + 厚事实块)+ tiers/{stable,standard,deep}/。 脊柱(AiCallRunner)恒定,策略可插(每档一套 prompt/schema/format,深度为 3 步 pipeline)。 - input_snapshot 全字段结构化:reasons[].toothPositions(FDI)/medicalRecord(SOAP 全字段,per-reason); recentTreatments/pendingTreatments/lastVisit 对象化;personaHighlights/guardian 补原始 key; 聚焦单一源 reasons[0](orchestrator 单一排序,prompt/fallback 不再各自 sort) - 标准档:去模板 4 段自由编排(标题由 LLM 起)+ 厚输入(病历/其他reason/近期治疗),病种只给名 - 深度档:3 步(规划→写多段→独立对抗校验)+ repair(≤1)+ 兜底;多段不定输出(ScriptSectionDto.id→string) - user prompt 补 {牙位}/本次目标(plan.goal)/医生医嘱·建议·治疗计划;≤18 禁拍片 belt - 儿童复查段修:对齐本次病种 + 用{复查时长},删写死"3个月常规涂氟检查" - 安全单一源 safety-rules.ts(禁词/承诺/加粗时间 + machineSafetyScan);composer tier-aware - runner generateObject 解析失败重试一次再兜底(flash 多段 JSON 偶发脆) - controller +tier query;实时教练后端上下文改读结构化字段 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
撤掉上一版的 {{}}/【】 token 方案(LLM 看不懂 + 跟 {xxx} 占位冲突),改成 **直接给"姓+敬称"的可用称呼**(去全名,非 token): - 称呼 徐女士 / 诊断医生 韩医生(deidentifyDoctor:韩维→韩,模板拼"韩医生")/ 客服 小王 → LLM 直接用、客服直接看;全名(徐雅静/韩维)不进 user prompt - 撤 pii.ts token/回填机制,orchestrator 去 detokenizeScript;base-system 去 token 占位声明 - 开场白顺序修正(打电话场景):先 称呼+确认对方 → 再 自报家门 → 医生交代 → 问近况 (原来自报家门在前,不符合电话礼仪) - call.ts fallback 医生同口径去名;promptVersion v13 - 验证:张震校 重生成 →「徐女士您好…我是…客服…韩医生特意交代…」顺序+去名正确 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
ScriptContext = 三档全集数据(tier-agnostic superset),各档后续组装 user prompt 各取所需; **不是审计快照**(关联走 agent_invocations.linked_patient_id 列)。 - nameMasked → salutation 正名(它是"通话称呼"非脱敏名);消费方 pii/call/header/realtime-coach 同步 - 加 name(真名)— 数据,补"患者名字都没有"的缺;但**不进 user prompt**(走 token 回填) - ID 类(externalId/id)不进(非审计,无需标识符) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
发给第三方 LLM 的 user_prompt 不再带真名;ScriptContext/input_snapshot(PAC 内部)不变。 - 新增 script-common/pii.ts:NAME_TOKEN(称呼/诊断医生/客服)+ realNames + detokenizeNames/Script · token 用「原样保留」约定 【】(同 【时间段1】),不能用 {{}}(会跟 {xxx}=要替换 占位冲突, 被 LLM 吐成单括号 → 露生 token) - prompt.ts:称呼/诊断医生/客服 emit token;监护人触达提示去全名(只留关系) - orchestrator:LLM 输出在渲染/写库前 detokenizeScript 回填真名(流式 partial + 终态都回填) - base-system.md:声明 【称呼】【诊断医生】【客服】 为系统回填占位,LLM 原样保留 - 验证:张震校 重生成 → prompt 无真名;输出"徐女士/韩维医生"正确回填;promptVersion v12 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- 统一称呼单一源 callSalutation(年龄+性别+监护人):未成年→监护人("徐女士")/家长, 成人→先生/女士;header + 开场白 + fallback 共用,不再各算一遍 · 修 bug:头部 `患者:张先生`(nameSpokenForm 无儿童分支)→ 9岁现为"徐女士" - 监护人进 ScriptContext:orchestrator 查 patient_relations(妈妈>爸爸>祖辈,优先已建档) → guardian + 触达提示"打给家长、患者是孩子(称宝宝)",称呼真正打给监护人 - user prompt basics 去掉称呼(原"徐女士,男,9岁"矛盾)→ 只留性别+年龄 - {最后一次就诊医生} → {诊断医生}(prompt + base-system.md + 人群模板 + schema), 标签对齐实际喂的 triggerDoctor(触发诊断的医生) - promptVersion bump v11 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
- 新增 script-common/disease-knowledge.ts:病种知识的 tier-agnostic 单一访问源 · diseaseKnowledgeForSubKey(subKey):subKey → {label,risks,advantages,reviewDuration} · resolveDisease(reason):subKey 优先 + 文本兜底(prompt + fallback 共用唯一入口) · SUBKEY_MAP 显式声明每病种在两套字典的中文 key → 收掉"双跳 + exact/includes 混用"脆弱性 - 修 bug:jaw_cyst 的 keypoints 字典 key 是「囊肿」、duration 是「颌骨囊肿」, 原 exact 查表静默丢 risks/advantages → 现分列对齐,颌骨囊肿召回拿回风险/优势要点 - prompt.ts / call.ts(fallback)改用 resolveDisease,删散落的 missedFromReason+lookupKeyPoints+lookupReviewDuration 三连 - 为标准/深度档铺路:同一份病种知识,后续档直接 resolveDisease 拿规则自由组织 - promptVersion bump v10 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
召回口径(乳牙): - missing_tooth 排除乳牙(FDI 51-85 + 象限 1A-4E)→ 乳牙缺失不进种植/修复召回 - 乳牙龋齿目标只显「充填」(去嵌体);前后端 + reason 文本统一走 treatmentCategoryNameZhForTeeth(@pac/types 共享 helper) - recall-oracle 同步乳牙规则(独立内联,守对抗纪律) 摄入: - 影像诊断粒度对齐医生诊断:列内逐牙拆分 → 牙位 ; 拼接(一码一 fact) - 回访 treatment_items + treatment_items_two 合并为单字段「大类·子项」 (transforms 合并 + normalizeMergedItems 空值归 null) 详情页: - 监护人 TEST-ONLY:儿童/老人触达 fallback,手机号旁标注(身份 姓名), 去掉关键事实「联系人」行 - 主治医生改口径 A:触发诊断的医生(影像源→「影像AI」兜底) - 病历快读:影像 AI 诊断加「影像」角标 - 召回理由列表页 +N 加 hover 展示其余 reason(对齐详情页) AI 话术(稳健档铺路): - DraftPlanScriptInput → ScriptContext(tier-agnostic,留 alias) - 剔除治疗链字段(chain-composer 将废弃):treatmentChainSummary 删、 ongoingChains → recentTreatments(只读 treatment_record「做过什么」) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-