- 17 Jun, 2026 3 commits
-
-
功能成型收口周:整合成一个客服工作台页面(患者列表固定/画像标签分类筛选/小助手内嵌) + 按业务验证反馈校准召回算法 + AI"说人话"打磨。沿用 W5「一页 Demo + 业务语言」结构。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
按反馈放开:画像标签、历史联系两处摘要的 prompt 去掉"只输出一句话/≤30-40字"等约束, schema 去掉 .max(80) 与字数说明(保留 .min(4) 防空)。只留"重点提炼不罗列 + 不无中生有"取向。 promptVersion bump 到 -d,旧缓存已清,重生成不再被掐短。召回简报不动。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
老板反馈原桌宠"做得太过"(满屏漫游/爬卡片/追光标/抓蛀牙菌/套绳)。工作台改用新的 静态 AssistantFab:固定不漫游、不爬 UI、不响应光标移动、无重力甩落;保留可拖动(拖到哪停哪、 位置记 localStorage)+ 点击开助手 + hover 被摸表情 + 有意义时刻原地反馈(AI思考/说话、成约、切患者)。 usePetBrain 加 calm 模式(不打盹、关 idle 轮盘)。完整桌宠保留在 PetFab + /pet-lab。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 16 Jun, 2026 9 commits
-
-
画像标签从身份卡拆出独立卡(详情抽屉:标签属性+取值,? hover 看规则,z-[70] 修被抽屉遮挡); 历史联系/画像标签/参考话术原因行均改为 LLM 一句话(shimmer 占位、失败回退结构化); 召回简报加主题色阶背景 + 箭头展开看原「为什么召回」;中栏 min-w-0 修长文撑爆右栏。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
规划改为从果(目标)倒推到因、层层递进、逻辑清晰(不钦定固定段式,给自由度),段数 3-6; 后果客观说明但不吓唬不推销。机器闸新增内部代码/术语拦截(K08、UPPER_SNAKE 枚举), prompt 要求一律说大白话。verify 增 ③逻辑与分寸 + ④患者听得懂(代码/术语/含糊)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
SummaryType 新增 recall_history / persona_tags / recall_brief;各配一个 Qwen AiCall (draft-recall-summary / draft-persona-summary / draft-recall-brief)+ get-or-generate orchestrator(缓存 plan_summaries,无数据 status=empty)+ controller GET 端点。 召回简报输入=召回原因+历史治疗(类目×次数)+画像,站患者立场答"谁/解决什么/到诊做什么"。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
architecture-v2 / db-design-v2 / three-layer-model / design-v2 顶部加「代码漂移修订」区块: Platform→Host(hostId)、AI Gateway/Dify→AiCall 多 provider、post_treatment_recall→ treatment_initiation/aftercare_recall、plan_summaries 3→4 type、persona 4→16 feature。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
修两个线上问题: - 上下文断:原来每条消息只传当前一句,无历史 → "该患者"无指代。 现按「群+人」维护会话记忆(内存,30min TTL,留最近 12 条),整段历史喂助手。 - 没给链接:AssistantService.chat 加 systemExtra,企微渠道注入指令 —— 纯文字/Markdown(不画 render_artifact)+ 用 plan id 拼 {webBase}/plans/<id> 给 Markdown 链接 + 多轮指代提示。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
把 PAC 助手接到企业微信「智能机器人 · API 模式 · 长连接」(@wecom/aibot-node-sdk): - 被动应答:群里 @机器人 → 收 message.text → 映射客服 token → 复用 AssistantService.chat (同一个助手大脑,自主调 MCP 工具)→ replyStream 流式回推(全量替换 + finish 收尾)。 - 主动推送:sendMessage 推「紧急召回」按钮卡片到群(带召回卡深链)。 - 按钮回写:模板卡片按钮点击 → 回写 plan_executions + 驱动状态机(召回闭环在企微内完成)。 开关:仅配置 PAC_WX_AIBOT_BOT_ID/SECRET 时启动长连接(其它环境静默跳过)。 身份映射 PoC:企微 userid 统一映射到 host=jvs-dw / 默认 tenant / staff;生产再换真实对照。 注:同一 bot 仅维持一条有效长连接(新连接踢旧),一个环境一个 bot; 卡片就地更新(updateTemplateCard)有企微 40058 待打磨,不影响回写。 demo 主动推送端点 @Public 但默认关(PAC_WX_AIBOT_DEMO_PUSH=1 才放行),生产勿开。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
↔ 根因:沙箱 iframe 用 ResizeObserver(body)上报 scrollHeight 给父页自适应高度; 当模型生成 maintainAspectRatio:false + 百分比/满高容器的 Chart.js 图表时, 画布撑高 body → iframe 拔高 → 画布响应式再撑高 → 一路冲到 1600 上限,看着像无限拉长。 修复(两道): - 沙箱 <style> 注入 canvas{max-height:360px!important} —— 切断反馈环的根治手段, 对任何模型 HTML 都生效(不依赖模型自觉)。 - SYSTEM_PROMPT 要求图表放固定高度容器 + maintainAspectRatio:false,禁百分比/满屏高度。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
页面版 EXAMPLES + 小窗(有/无当前患者两支)都加上"今日推荐:挑几个该优先 跟进的患者,并说明理由"——引导用 recall_queue_stats + list_recall_queue 出今日 top + 逐条理由。页面版替换掉与之重复的"准备今天要跟进的召回工作"。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
「今日推荐」开放能力(Tier 1,纯读、复用已有后端逻辑): - 从 plan.service.list 抽出 buildListWhere,list / queueStats 共用同一套 view + 显式 filter + clinic 隔离 + persona 圈人逻辑(零行为变化)。 - list_recall_queue 入参透传 personaTags(14 维画像圈人,字典自 PERSONA_TAG_FILTER_DIMS 生成)+ scenario / status / keyword / phoneVerified / sort(后端早已支持,只是没暴露)。 - 新增 plan.service.queueStats + MCP recall_queue_stats:总量 + 优先级分档(高≥70/中/低) + 病种(sub_scenario)分布,供 LLM 先出摘要再取明细。 后续 CS 知识/习惯数据成熟后,可作为「今日推荐」的参考输入接入(预留)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 15 Jun, 2026 12 commits
-
-
HoverCardContent 包 Portal + collisionPadding,优先级浮层逃出侧栏 overflow:hidden 不再被裁。桌宠套绳手势加距离上限(宠物
↔ 鼠标 ≤ 半屏高),超距不触发。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
诊断"过度磨耗/磨耗"原落空码漏召(于季敏 46;47)。diagnosis.yaml keyword 加 { value: K03, any:[磨耗], none:[生理,轻度,义齿,人工牙] },放 K02/K05 之后 让龋/牙周复合名优先;假牙磨损经 none 护栏正确排除。需 reparse diagnosis 生效。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
§E 正畸减数位排除收紧:仅前磨牙(^[1-4][45])+ 纯前磨牙记录 + 对称成对 (14;24 或 34;44),避免把普通缺牙误判为正畸减数(张学军 24 误排修正)。 牙未拔除独立场景:EXTRACTION_RECOMMENDED 跨病种拔除动作不再硬归 K01 (毕强松动牙被误标"阻生牙未拔除")。新增 extraction_recommended 子场景 (中性"牙未拔除"),GAP_FLAGS deferToToothDx 让位同牙编码诊断,去重避免双召。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- ai-invocations: callKey 阈值注释 <10 → <=20(对齐代码 callKeys.length<=20) - dw-lag-monitor: webhook 已接 AlertService.send,删过时 (TODO) - derive.op: 内置 op 注释 8 → 9(漏了 recode) - dictation.gateway: partial 间隔注释 700ms → 450ms(对齐 PARTIAL_EVERY_MS=450) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
两个 feature 各自的私有 ageYears 副本 → 改用 potential-treatment.feature 已导出的 ageYearsAt(urgency-level 已在用),顺手用其 null 语义合并"无出生日期"与"脏数据"判断。 service tsc 通过。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- main.ts CORS origins 改读 config.get('cors').origins(消除与 configuration.ts 的重复解析, 同时救活原本无人读的 cors config 字段);行为不变 - auth.service: 4 处 parseDurationToSeconds(jwt.expiresIn) 收口为 memoized getter accessExpiresInSeconds service tsc 通过。 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 -
- hosts.service: 7 处 `host.findUnique + if(!p) throw NotFound` 收口为私有 getHostOrThrow(id) - treatment-initiation-recall.scenario: 两处逐字相同的 trigger-type 三元抽 triggerTypeOf(row) service tsc 通过。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- chain-composer: 删 filterDiscoveredByPatientLevel(无调用,doc 复位给 markAlternativeClosed)、 collectS1Facts、_S2_PAYMENT_THRESHOLD_CENTS_DEPRECATED(+void 语句)、ComposeInputEncounter 兼容别名 - plan-aggregate: 删 PatientWithProfile/Fact/loadFactStub 自引用死类型链(declare-only) - admin.dto: 删 CreateHostRequestDto/CreateHostResponseDto/AiInvocationListItemDto 未用包装类 + 对应 schema import - skill-registry: 删未用 getSkill - mock-data(web): fmtDate 去 export(仅内部用) service + web tsc 通过。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
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 11 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
-