- 26 Jun, 2026 7 commits
-
-
- 新增 §7.5 权限模型:功能权限(角色,代码级,保持)/ 数据范围(应绑 org 子树, 非角色逃生门)/ 数据共享策略(集团级结构配置)三者正交,现状把前两者搅在一起 - org_units 整体推到 P2:P0/P1 用 source_unit 字符串列 + 集团级品牌共享策略即可, 不需要建树;org_units 只在多级组织/层级数据范围/rollup 时才引入 - 子表不冗余 source_unit:召回 SQL 与 plan 列表本就 join patient,过滤近乎免费 - scope 分期标注:brandSharingPolicy=P1,orgUnitSubtree=P2 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
- 患者命名空间限定符 brand → 通用 source_unit(manifest 声明源字段,brand 仅瑞尔实例) - org_units.unit_type 字符串枚举且 ≠ 层级:层级靠 parent_id 树,支持多级区域/无品牌等任意形状 - host:集团=1:N 确认,现有 schema 已支持,无需改 - 集团 ID 三来源:宿主 group_id 透传 / PAC 配 tenant_map→集团 / 必填定义;集团 UUID 新发 - 纵深防御定稿:Prisma $extends + AsyncLocalStorage,RLS 作 P2+ 硬化 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
设计稿(未动代码)。核心:tenant_id 语义 品牌→集团,brand 降为患者键 命名空间限定符 + org_units 节点,品牌共享改为可配置策略;引入 org_units 组织树。含迁移核心洞察(换槽位不加信息、472 撞号不合并)、四层影响面、 schema/摄入/认证/查询隔离/clinic 各改动点、一次性迁移步骤、P0-P3 分期、 待决策项、关键文件改动清单。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
persona 重算 16 特征是 Node 单线程 CPU 计算,实测 conc=8 不提速反略慢; 加注释解释为何保持串行(真要提速需 profile 或多进程/worker)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
关键词搜索 OR 增 medicalRecordNumber 模糊匹配;左栏 placeholder 「患者号」→「病历号」。注:externalId 非病历号,medical_record_number 才是。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
reason.leadTrigger 透传到话术/召回简报:lead=建议(无诊断)→ 病种名用 建议名(如「建议种植」),不套「缺失牙」;诊断/影像仍以诊断为准。 召回简报 prompt 增来源标注【医生建议·非确诊缺失】+ 硬规则 + 建议示例, 修复张宇晨这类"仅建议"被 LLM 说成"缺牙空了X个月"。 reason-line 前端 subLabel 同步触发感知。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
诊断 1.0 / 建议 0.8 / 影像AI 0.5 三源置信度直用为打分因子(下限0.5), 取代旧 0.75/0.9/1.0 分档;triggers 按 诊断>建议>影像 排序定 lead, reason 文案由 lead 来源驱动(建议为首不再套子场景诊断词)。 priority-hover 提示同步为「诊断1.0/建议0.8/影像0.5」。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 25 Jun, 2026 6 commits
-
-
上一版加错位置。改到 RawJson 控制行右侧:全屏时 JSON 块 fixed inset-0 覆盖全屏、<pre> 去 max-h-80 改 flex-1 overflow-auto 撑满可滚,Esc 退出。便于看全大段原始报文 JSON。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
为什么召·证据链(T0)面板右上角加全屏切换(Maximize2/Minimize2);CSS 固定覆盖式全屏(fixed inset-0 z-50,内容区 overflow-auto 可滚),Esc 退出。便于看长 JSON 原始报文。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
10 个子场景(K00-K09)查询彼此独立,合并/去重与顺序无关。新增 PAC_RECALL_SUBSCENARIO_CONCURRENCY env(>1 开分块 Promise.all 并行,默认 1 串行、行为不变)。83K 患者本地实测:串行 50s→并行(conc=4)31s(warm 1.6×)/ cold 123s→47s(2.6×),固定 now 下两路 59032 hits 逐 hit 完全一致(等价性证实)。规则零改动,仅改执行方式。prod 建议设 =4。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
EXPLAIN 定位:selectHits 的 sig 信号扫描 + gap resolvedTeeth 各子查询都按 (patient_id,type,status) 过滤,原仅 (patient_id,status) 索引 → type 走内存 Filter,facts/患者多时 heap fetch 超线性膨胀(本地单条 K08 查询读 1.3GB 页面产 81 行)。加复合索引后所有子查询命中 Bitmap Index Scan。本地 selectHits warm 7.3s→2.0s(~3.6×),prod 13万患者收益更大。 迁移用 CREATE INDEX IF NOT EXISTS:prod 大表可先手动 CREATE INDEX CONCURRENTLY 预建免锁表,再 deploy 时本句 no-op。规则零改动、纯加速。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
新增 plan-engine-batch.spec.ts:忠实内存 mock 端到端验证批量路径 5 种结局(create/unchanged/superseded/suppressed/stale-close)+ 混合并发 + createMany 日志,与逐患者语义等价。修 plan-engine-stale-close.spec.ts 过时 mock(status:{in}匹配、加 persona.findMany/createMany)与返回形态断言(toMatchObject);assigned 0命中关闭对齐 2026-06 决策。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed -
夜间全 host plan 重算的 upsert 段原为逐患者串行(每人 2 读 latest/snoozed + persona + 2 日志写),13万患者 ~49min。改为:循环前一次性 bulk 预取 latest(含 reasons)/snooze 抑制集/active persona → 逐患复用同一 upsertPlan 判定(结果等价)→ 写操作分块并发(PAC_PLAN_BATCH_CONCURRENCY 默认 8)→ PlanGenerationLog 收集后 createMany(每患仍一行,口径不变)。selectHits 全表扫不在本次范围(时间规则可改,每轮须全量重选)。单刷 recomputeForPatient 不传 prefetched,行为不变。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 24 Jun, 2026 7 commits
-
-
inputSnapshot 实际存字面输入(非 factIds/version 引用)。证据链按'依据什么+能定位问题'收口,不做按源头版本重建;回查触发 fact 走 plan_reason.evidence。纯注释,无结构变更、无需迁移。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
空态(无计划)header 缺用户信息/退出入口,补上(useAuthStore.clear())。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
牙位事实视图缺固定桥几何:修复类同象限基牙间的缺失牙=桥体,补'桥体 · 已由 X-Y 固定桥覆盖'行(teal,对齐既有非修复 note)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
deep 策略 verify 阶段把 issues[] 透传到 stream 事件;前端会话过程区展开每条问题的 段落/问题/修法。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
ReconcileOrchestrator 走单 tenant dispatcher,原写死 t_default 会把真实数据(如 jvs-dw ba67e6cf)写到错 tenant 造重复患者。改为从 host 已有数据解析 tenant:单 tenant 用之;多 tenant(瑞尔+瑞泰)直接 BadRequestException 拒绝并指向 `pnpm sync`(按 brand 派 tenant 的正确补数路径)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
原'加了多少计划'看不懂;改成进出双向统计:进=净新(version=1)+翻版(version>1),出=失效(superseded 无在跑计划)+完成(completed)。persona 重算补 status 明细(含 noop)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
独立 /admin/recall-debug 研发页:为什么召走 plan→reason→fact→transaction 溯源;为什么没召跑引擎 ground-truth + gate 漏斗。支持 ?patientId 深链、姓名搜索(重名)、版本选择、JSON 深解析、rawPayload 懒加载。SUB_SCENARIOS 改 public 供归因交叉核对。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed
-
- 22 Jun, 2026 3 commits
-
-
删 HostsAdminController(/admin/hosts 列表/改任意 host 的裸 API,无 UI 在用):host 管理只走 pnpm pac:host CLI + 自管页 /admin/host/self(按 token hostId 自动 scope,碰不到别家)→ 多 host 天然隔离、免拆权限。自管页去掉 Timezone/Amount Unit/Pull endpoints(真实配置在 manifest.yaml, DB pullConfig 这几项无人消费、会误导),保留凭据轮换/激活停用/运行状态/最近事件。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
计划治疗(treatment_record kind=planned 且未完成)拆成独立筛选 chip「治疗计划」(虚拟键 treatment_plan),sky 标签/「计划」徽标/虚线空心点,跟已做的「治疗」(slate「已完成」)区分; 已做掉的计划归回「治疗 / 已完成」(状态感知 isPlannedTreatment)。筛选 chip 选中色 = 各区块色。 治疗历史详情默认只激活「治疗」。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
luoqi committed -
新增 DailyHealthReportService:每日 09:00(Asia/Shanghai)把线上状态收口成一条简洁日报推企微 (复用 AlertService webhook,整体级别取最差→图标自动 🟢/🟡/
🔴 )。指标含近24h diff: 摄入+DW延迟、画像/召回重算、数据量(患者/事实/计划增量)、召回池待办、客服执行(按outcome)、 画像覆盖、AI用量。手动触发端点 /internal/health-report/{preview,run}(env PAC_HEALTH_REPORT_DEMO 门控)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>luoqi committed
-
- 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 5 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
-