1. 11 Jun, 2026 40 commits
    • fix(recall): 外院已治疗匹配收紧 — 只看 result + 紧邻治疗词 + 排意图(修干扰) · 4d48fb4c
      原规则 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
    • fix(recall): 外院已治疗(回访记录)患者级排除该诊断召回(一线反馈②) · 5e9744c6
      李姝妤 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
    • fix(ingest): 宿主 ICD 错标纠偏 K00后天缺失→K08 — 修"萌出异常"误召(一线反馈⑭) · 4fbc08a7
      关平 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
    • docs: 核验⑩ 李石明 — 正确召回(上颌活动义齿已排除,下颌37;47+残根43未修该召) · d0e76a61
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • fix(recall): 患者无意愿(治疗 subtype)对本次诊断排除该类目(一线反馈⑧) · 4abc7f0c
      余奕铭 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
    • fix(recall): 词典加"间隙不足" — 缺牙无空间需先正畸,同属无修复指征(一线反馈⑥) · 7d5497b5
      李强 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
    • feat(web): 牙位事实视图补'无修复指征'注记 — 缺牙间隙关闭的牙显灰行(一线反馈⑤) · 21ae9e68
      牙位事实(tooth-timeline)是原始事实流,不展示 exam_findings → 26 这类'缺牙但间隙
      关闭无需修复'看着像未处理。补:从 facts 解析 exam_findings,'缺牙+间隙关闭/无修复
      间隙'的牙位在泳道末尾加灰色'非修复'行+检查原文。同后端 gap/前端 oracle 词典口径。
      web build 过。
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • fix(web): 召回对账 oracle 同步'检查文本无修复指征'分支 — 与后端 gap 一致 · 38199a65
      后端 gap (a''') 用 exam_findings'缺牙间隙关闭/无修复间隙'排除该牙;前端对账 oracle
      镜像同口径(词典 NO_RESTORATION_GAP_EXAM_PATTERNS),否则审计视图报假分歧。
      判 ineligible(非修复),理由'检查所见缺牙间隙已关闭'。web build 过。
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • docs: 核验⑤ 王敏 — 检查文本无修复指征已修(修复3),补修复记录 · 3af7499d
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • fix(recall): 检查文本"缺牙间隙关闭/无修复间隙"计入无修复指征(一线反馈⑤) · 256295db
      王敏 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
    • fix(recall): 固定桥牙位盲点 — 基牙跨度区间计入已修复(一线反馈④⑯) · 5462fc71
      桥的治疗记录牙位只写基牙(④ 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
    • docs: 核验③ 秦溢泽 — 召回正确;取资料(EMR原文)/未回复(约方案后无到诊)均有数据印证 · 0758a8f6
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • docs: 核验② 改待定 — 回访记录 4.21 有'已在外院矫正中'(召回未消费回访文本);数仓核对中 · d08bb743
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • docs: 核验② 李姝妤 — 库内零外院痕迹,召回正确,信息差走回写关单 · faaa515a
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • fix(ingest): 拆线归外科类(根源)— 修术后复诊期误召(一线反馈①⑪) · 1971ede6
      拆线是治疗动作,原被 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
    • fix(recall): 拆线/种植复查计入"治疗已启动"证据 — 修术后复诊期误召(一线反馈①) · 1e716414
      口径(与产品对齐):诊断信号保真,新诊断必然参与召回判定,不动;
      缺口在治疗证据侧 — 光杆"拆线"落 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
    • fix(recall): make_interval 参数加 ::int 转型 — Prisma 数字绑成 bigint 致 42883 · 66703e8f
      上个 commit 验证结论有误(管道 tail 吞了退出码,实际 SQL 报错)。本次修正后重验:
      recompute-plans 全量 exit=0;recompute-persona 单患者(共用 gap 核心)success=1。
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • fix(recall): 复述诊断不重新拉弓 — 排除谓词放宽黄金窗回看 + 一线反馈核验文档 · cb5e4bc1
      一线反馈①(李然 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
    • fix(sync): 增量列患者改为各游标表变更患者的并集 — 修"约诊未到诊"类永久漏数 · 48d9aee0
      根因(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
    • feat(persona): 标签覆盖率日报 — 每天 08:00 企微,显著下跌升级 warning · 838d26b9
      标签质量运营第一道防线:规则标签会静默腐烂(上游字段改名/枚举漂移/断供时悄悄变空)。
      - 每天北京 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
    • fix(types)+docs: referral_champion 时间语义 snapshot→lifetime + 补判别准则 · f3277ba4
      - 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
    • docs: 时间语义对齐 persona-design-v2 正式模型 — 注册表 timeSemantics 五值 + 标签表加列 · 42a5b7ab
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • docs: 画像速览补时间语义 — 四类口径(静态/全史/滚动窗/距今切档)+ gap 悬置特例 · 3c8123c1
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • docs: 画像实现速览 — 面向开发交流(16标签/刷新策略/幂等版本化/特色) · b1717ed1
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      luoqi committed
    • style(web): 卡片边框 slate-200 → slate-100 发丝线 — 降噪去"框感"(只动边框色) · 89a3b72c
      现代清爽审美的常见做法:保留 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
    • fix(web): 根路径跳转上移到 next.config redirects — 消除 HomePage 负时间戳报错 · d66dc855
      server 组件里 redirect('/plans') 让 Next dev 给未开始计时的 HomePage 打渲染耗时
      → "Performance measure cannot have a negative time stamp"。改用路由层 redirects()
      (/ → /plans),渲染前重定向、不渲染该组件,从源头消除;删冗余 (app)/page.tsx。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): 助手窗口跟随钮位弹出 — 上方优先/左右半屏对齐/视窗内夹紧 · de08d506
      点开瞬间按钮当前位置算窗口落点:水平按钮在左/右半屏决定对齐边;垂直优先钮上方,
      放不下弹下方;整体 clamp 视窗内。拖钮避让区域的意义由此成立。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • fix(web): 助手钮/小窗 z-40→z-[60] — 高于左栏容器(z-50),拖到左侧不再被挡 · b46a8211
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): 详情 TopBar 加退出登录 + 助手悬浮钮可拖移 · 4a58cd0c
      - 退出:TopBar 最右(头像后)LogOut 钮,与原列表页同口径(clear token → AuthGate 弹回登录)。
      - 助手钮:pointer 拖动,4px 位移阈值区分点击/拖动(拖完不误开窗);
        位置 localStorage 记忆(pac-assistant-fab-pos),clamp 视口内;默认右下角。
      
      web tsc 0 + Next 生产构建过。仅本地,未部署。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): /plans 改工作台入口解析器 — 直落详情(列表页弃用,组件保留未挂载) · 0ebda9bc
      根路径/旧链接进来直接到详情工作台,选人规则(纯规则):
        ① 我的「进行中」优先级 TOP1(续上手头工作)
        ② 无 → 召回池 TOP1(开新工作)
        ③ 都无 → 空工作台:左栏照常可筛(自行找人)+ 右侧整体空态(说明 + 刷新)
      解析期间居中过场;PLAN_VIEW_OWN 权限门同列表页。旧 PlansListApp 保留在仓库不再挂载。
      
      web tsc 0 + Next 生产构建过。仅本地,未部署。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • fix(web): artifact 放大窗 portal 到 body — 小窗 transform 祖先把 fixed 圈住致其困在助手窗内 · dc5de128
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): artifact 放大改本屏居中大窗 — 流式生成时大窗同步实时"长" · 9dc2093f
      - iframe 渲染抽成 ArtifactFrame(持久壳 + postMessage 注入)可多实例:
        内联卡 + 居中大窗各挂一个,同吃一份流式 html → 放大后内容继续实时增长;
        生成中大窗头部带 ⟳ 提示。
      - 放大键不再开新 tab → 居中大窗(min(980px,94vw) × 86vh,遮罩/✕ 关闭,z-[70]);
        大窗内保留「新窗口打开」小按钮;内联卡 autoHeight 原行为,大窗锁高内部滚动。
      
      web tsc 0 + Next 生产构建过。仅本地,未部署。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): 助手小窗开场建议场景化(规则生成,与 /assistant 页不共用) · 74735286
      - AssistantChat 加 examples 覆盖参数(不传 = 页面版默认三条 → 两版不共用)。
      - 详情页 ready 时把 {planId, 患者名} 发布到 plan-sync-store.current;
        小窗按规则出建议(非 AI):有当前患者 → ①为什么被召回/捋关键事实 ②画像+潜在治疗
        ③这通电话怎么开口;无上下文 → 召回池TOP/今日工作 兜底。切患者建议自动跟随。
      
      web tsc 0 + Next 生产构建过。仅本地,未部署。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): 助手抽公用 — 详情页右下角吸附小窗(与 /assistant 同能力) · ce6bec2d
      - AssistantChat 加 variant('page'|'widget'):page 整页原样(/assistant 保留零回归);
        widget 紧凑头部(助手 + 模型切换 + ⌄收起)+ h-full 适配容器。
      - 新 AssistantWidget:右下角悬浮圆钮 ⇄ 400×620(max 78vh)吸附窗;
        收起为 CSS 隐藏不卸载 → 对话/工具步骤/artifact/听写状态保留;
        挂在 plans/layout(路由段之上)→ 切患者对话不丢;权限 AGENT_INVOKE 同 /assistant。
      - 功能与 /assistant 完全一致(MCP 工具透明步骤 / markdown / HTML 卡片 / 实时听写)。
      
      web tsc 0 + Next 生产构建过。仅本地,未部署。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • fix(web): 工作台抽屉临界点 1280→1024(lg) + 把手 z-50 防被详情面板覆盖 · 4c0af7a8
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): 工作台跨栏状态同步 + 小屏左栏抽屉化(左缘把手点击点) · ee05257d
      1. 右侧操作 → 左栏实时同步:新增 plan-sync-store(zustand 事件总线);
         详情提交回写成功(submitExecution → planStatus)→ notify → 左栏 patchItem
         原地更新该行状态 pill(不重拉、不丢滚动/筛选)。
      2. <xl 左栏收成固定抽屉:单实例 CSS 平移(不重挂 → 筛选/分页/滚动保留);
         左缘 teal 竖把手「选患者」作明确点击点;遮罩点击/抽屉沿 ✕/选中患者 三种方式收起;
         xl+ 常驻不变。
      
      web tsc 0 + Next 生产构建过。仅本地,未部署。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): 画像标签全量圈人(14维)+ 左栏认领按钮 + 切患者不再白闪 · 01663a75
      1. 画像标签筛选扩到全部枚举型标签(4→14 维):新增 年龄段9/性别2/家庭构成4/权益身份5/
         治疗史4/治疗敏感4/特殊关注4/时间偏好5/转介绍达人2/禁忌1;code中文逐一对齐各 extractor
         的 data 写入值。未收录并注明原因:获客渠道(取值随宿主非稳定枚举)、折扣锚点(数值型)。
         后端零改动(字典驱动,plan.service 通吃)。
      2. 左栏行 hover 出「认领」(仅 待认领+未分配)→ assign 给自己 → patchItem 原地改"进行中"
         (不重拉、不丢滚动/筛选)+ toast;usePatientPicker 加 patchItem。
      3. 切患者白闪修复 — 保留 URL 路由(可刷新/分享/回退),loader 加 stale-while-loading:
         模块级缓存上一份聚合,加载期旧详情垫底(60% 透明)+ "切换中…"小罩,新数据到无缝替换。
      
      web tsc 0 + Next 生产构建过。仅本地,未部署。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed
    • feat(web): 工作台布局改上下(header 全宽到最左)+ 左栏行/筛选五处打磨 · 4d04c361
      按反馈:
      1. 上下大布局:详情 TopBar 经 createPortal 渲到 plans/layout 顶部全宽槽
         (HeaderSlotPortal;无槽独立打开时原位渲染兜底)→ header 延伸到最左,左栏在其下;
         PlanDetailApp 根 h-screen→h-full,详情页包裹补高度链。
      2. 左栏行加性别(formatGender,与列表页同源)+ 诊所名(token 字典翻译)。
      3. 加诊所筛选(popover 多选 → 服务端 targetClinicIds,与列表页同款交互)。
      4. 优先级展示对齐列表页:五格色条 + 10 分制数值 + PriorityHover 算分明细。
      5. 行内去掉场景标签;状态改彩色 pill(待认领/进行中/已完成/已放弃,STATUS_META 同款)。
      
      web tsc 0 + Next 生产构建过。仅本地,未部署。
      
      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
      luoqi committed