- 24 Jul, 2026 2 commits
-
-
FRIDAY 开发对接 push 时需要"我推了什么 / PAC 收到什么 / 成了几条 / 错在哪",补两个自助能力: 1) 预检 POST /pac/v1/push/rows?dryRun=1 跑完整管线(transforms + 装配 + 归一 + 租户解析)但**不落任何库、不触发重算**, 响应带 dryRun 标志与各资源**样本 canonical** —— 宿主可直接核对 PAC 把原生行翻译成了什么。 复用 cold-import 既有 dryRun 通路(processSubject/processPatients 已支持), ingestRawTables 此前硬编码 false,现按 opts.dryRun 透传;预检批次 syncLog 以 triggeredBy `push-dryrun:` 前缀标识,不与正式推送混淆。 2) 推送记录 GET /pac/v1/admin/host/self/push-logs?limit=50(宿主自助权限) 按时间倒序列最近 N 批(上限 200):source / status / dryRun / 收行数 / 落库数 / 去重 / 失败 / 报错原因。sync_logs 本已记全,此前未对宿主暴露 —— 当时的同步响应 没留存也能事后查"哪批错了、错在哪"。 文档补 §7「对接自测」:预检用法与通过标准(failed=0 且 mappingMisses/suspectFields=0)、 推送记录、可用面(API 文档 /api/docs、宿主自助页、队列面板)、常见错误码速查。 验证:本地实推 —— 预检 6 行→"若推会落 5"(1 噪音被过滤)、返回 payment/refund 样本、 **患者数仍为 0 确认零落库**;push-logs 正确区分预检(dryRun=true)与正式批次。 typecheck 干净,299 测试绿。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
两条纪律收紧(宿主零改名、零行过滤): 1) inline 列不再用 PAC 自造名,一律沿用宿主源列名: - customer_basic_info:phone/phone_relationship → contacts_tel/relationship(customer_contacts 原名) - med_emr_info.diag[]:stdCode → std_code(std_diag 原名) - class_name / organization_id / plan_name 本就是宿主原名,不变 宿主无需为 PAC 做任何字段改名。 2) 文档删除各表「推送范围」:med_emr_info 那条 status∈{3,4} 是残留的宿主侧过滤, 而 manifest E.0 已在 PAC 侧排草稿 —— 重复且违背单一真理源。改为 §1 统一声明 「整表照推,宿主不做任何行过滤;status/金额切分全部由 PAC 完成」。 验证:元和王永 dry-run 与改前逐项一致(patients=16472 txns=117718 failed=0; phone/K04/modality/退费 190+308 全对);typecheck 干净,299 测试绿。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed
-
- 23 Jul, 2026 7 commits
-
-
push 自洽收尾(判据:PAC 已有主体的不 inline,值不可信的才 inline): - refund_item:spec.patient_id 部分品牌是诊所本地垃圾 id、不可信 → 宿主导出时 JOIN 结算头 把真 patient_id 反填进 spec(inline);删 S.3.1 跨表 lookup,refund_item 单表 push 自洽。 (patient_relation 不动:referee 本身是 PAC 患者实体,referee_sex 可从自有实体解析,无需 inline) - drift 误报修复:refund_full/refund_item 共用 subjectType='refund' 但源表列集不同, detectRawColumnDrift 按「与本批列签名 Jaccard≥0.5」自选同源样本,排除跨源混列(消除 suspectFields 虚警) 验证:元和王永 dry-run refund_item=308(样本 patientExternalId=659325 真 6 位 id,无 lookup)、 refund_full=190、failed=0;299 测试绿、typecheck 干净。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
manifest 共用于所有摄入路径(cold-import/file/pull/push/reparse),改它一处全生效。 删 5 处跨表 lookup + 5 张源表,宿主导出时 within-host join 后 inline: - 私有字典(std_diag/std_check_class)→ diag[].stdCode / med_check.class_name(删 lookup + 源表) - 联系方式 1:N(customer_contacts)→ customer_basic_info.phone/phone_relationship(挑默认号) - 计划头(customer_treat_plan)→ 计划行 organization_id/plan_name(删 lookup + 头源表 + group) - 支付通道(settlement_modes)→ 不摄入(金额在结算头 net_receipts_this;payment 去掉 method) - incremental 清废弃表名(patient_settlement_refund/spec_refund)+ 补 patient_settlement_spec export.sh 同步改成自洽形态(within-host join;含 diag stdCode 跨库预取 map); image.yaml primary image_rows→med_check;payment.yaml 去 method。 验证:元和王永 16472 患者 dry-run 逐资源计数与 inline 前**完全一致** (patient/diagnosis 4458/treatment 5781/image 6170/payment 20995/refund 190+308); 中间表 41→33;typecheck 干净;全量 299 测试绿。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
确立职责边界:宿主推送前解析好自己的引用、inline 进相关行;PAC 只做跨宿主临床归一。 14 → 9 个 source,删掉 5 张 lookup-only 源表: - std_diag / std_check_class(纯翻译字典)→ 宿主解析 stdCode/class_name inline 进 diag[]/med_check; 省掉大表全量重推 + PAC 持久化字典存储(仅留 _shared 跨宿主临床字典) - customer_contacts(PAC 只要默认号+归属)→ inline phone/phone_relationship 进 customer_basic_info - settlement_modes(总值在结算头 net_receipts_this,24% 多通道拆付暂不需要)→ 不摄入 - customer_treat_plan 头(PAC 只取诊所/方案名)→ inline organization_id/plan_name 进计划行 结果:每张 source 自洽,增量推变更行天然成立,无跨表依赖/无新表/无 hydration。 注:manifest + export.sh 的对应改动(删 lookup、宿主侧 join inline)随后跟进。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
- std_check_class 此前仅在 med_check 末尾一行带过 → 补成与 std_diag 对齐的正式字段小节; §4 病历链 3→4 个 source(14 张源表全部有独立小节) - 两字典作用域澄清:按品牌维护、但 code(diag_code/class_code)全局唯一 → lookup 不需租户限定 - 推送方式从「变更时全量重推」改为「按 code upsert、增量推变更行」(与其他表一致); 规模更正:std_diag 生产多品牌合计 1.5万~3万+行(非测试库 4 品牌的 2739),全推确实浪费。 依赖 PAC 侧持久化字典存储(落地中) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
union-primary 资源(refund_full_rows ← union[status4, status3负额])此前回溯不到源表 (traceRawSourceTable 只认单 input/output),导致 push source=patient_settlement 时 refund_full assembler 不入选、reparse 也跳过 → **整单退费在这两条路径静默丢财务数据**。 修:union 各输入独立回溯,全部收敛到同一根表(两路都 → patient_settlement)才返回该根; 发散到多根则停在 union 输出(维持旧行为不误判)。export 供单测。 验证:108467 重推 patient_settlement → refund_full 落库(txn=1 新增,2 payment 幂等 dup); 单测 6 绿(union 收敛/发散/单链/route/lookup);全量 299 绿无回归。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
- friday-push-payload:结算段从「宿主分流 4 source」改为「推 3 张原表、WHERE 全在 PAC」; 删 patient_settlement_refund/spec_refund 两个已废弃 source;新增 spec.patient_id 不可信说明; source 计数 15→14 - 新增 data-reconciliation:源
↔ PAC 计数对账口径 - ingestion / meta:配套更新 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed -
- 结算/病历 WHERE 从导出侧迁入 manifest transforms(单一真理源):宿主推原表全 status, PAC 侧 filter 切消费/退费/退费明细;transforms 新增数值算子 lt/lte/gt/gte - 退费明细身份纠正(S.3.1):spec.patient_id 部分品牌是诊所本地 id 不可信, 改从结算头 settlement_id→patient_id 继承(元和王永实测 26421 行全不符) - 冷导入网页上传通道:上传 zip → yauzl 白名单解压 → 迷你 data 根(含 _shared)→ 队列 cold-import;宽容缺独立表 + 成组完整性校验 + dry-run 预检 - 数据对账:日报复用摄入查询做「源
↔ PAC 去重患者数」比对(clickhouse countDistinct) - 测试 18 绿:friday-settlement-where / filter-numeric / cold-import-extract / cold-import-groups Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed
-
- 22 Jul, 2026 2 commits
-
-
清缓存与 reparse/persona/plan 不是一类动作(不重算、秒级、按需重生成), 放进同一张表会误导"改 prompt 也要跑重算"。改为表下引用块说明。 顺带修补编辑残留:表格首行多一列、③ 代码块缺收尾 ```。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
面向"自己动手部署"的 runbook,不重复 deployment.mdx 的架构介绍,直接给命令: - 三环境速查表(位置/目录/分支/DB/部署方式)+ 分支规约 - 本地开发(docker 基础设施 + 原生跑应用)+ 4 个常见问题 - 测试/生产部署命令(生产强调 COMPOSE_MANAGED=1 与 source .env) - 部署后要不要重算的对照表 + 固定顺序(reparse→persona→plan→清缓存)+ 耗时参考 - 定向补数据(PAC_COHORT_ONLY_PATIENT @file)参数与分批阈值 - 失败处理/回滚、7 个踩过的坑(含 pkill 自杀、ClickHouse 256KB 上限)、日常巡检 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed
-
- 21 Jul, 2026 11 commits
-
-
# Conflicts: # apps/pac-service/tests/recall-suppression.spec.ts
luoqi committed -
luoqi committed
-
背景:DW 病历表 patient_id 错位污染(高逸铭案例),需按名单重摄 3 万患者。 沿用现有 PAC_COHORT_ONLY_PATIENT(cohort 收窄)时发现两个阻塞问题: 1)
⭐ 静默丢数据:只要 manifest 配了 incremental.per_query(jvs-dw 配了), cold-import 任何模式都写 cursor_after=run_start。定向轮只覆盖名单内患者, 却推进全局水位 → 名单外患者在本轮期间的 DW 新写入被永久埋在游标下方。 (与本次排查发现的"12,595 个患者符合 cohort 却从未摄入"是同类机制) 修:定向模式下 cursor 保持上次水位不推进,daily 增量照常从原点接力。 2) 大名单 E2BIG:3 万个 id 的逗号串约 275KB > 环境变量单值 128KB(MAX_ARG_STRLEN)。 修:支持 PAC_COHORT_ONLY_PATIENT=@/path/to/file(每行一个 id);逗号列表照旧兼容。 顺带:定向生效时打印命中患者数,便于核对名单规模。 测试 7 例:空/空白不误判定向、逗号列表、@file(含 3 万行)、文件缺失须抛错不静默退化。 生产验证(高逸铭组 7 人小批):删除→重摄后 高逸铭 62 事实/6 诊所 → 21/1(上海时代),别人的数据清光 刘晓旭 13 → 25、徐嘉悦 126 → 130,被吞的数据补回,诊所归属全部正确 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
跟进诊所重归属(7b4f0d93)的补丁:诊所隔离是硬边界(list/detail 都强制 targetClinicId ∈ scope.clinicIds),已认领单漂出原认领人 scope 后会变成 谁都看不见的孤儿单(assigned 不进池、新店客服非 assignee、原客服出 scope)。 - unchanged 就地改归属:若 status=assigned 且诊所变了 → 返池(assignee/assignedAt/recycleAt 清空) - 升版本路径:clinicMoved 时 assigned 不继承,新版本直接回池(与上同规则) - 两路径都记 log(哪单从哪店改到哪店),上线后可巡检 - 测试 +3:两路径返池 + 归属未变时继承不误伤(12/12);顺带修 mock seed 缺 targetClinicId Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
业务口径(2026-07):运营按客户最后一次到诊的诊所做跟进分类,谁家最后来过就归谁家客服 ——原口径 target_clinic_id = 触发诊断 fact 所在诊所,会把主诊所患者顺路在别处拍片/被诊断 的人错分到那家只去过一次的诊所(反馈案例 BJ0D046171:150+次天使大厦、1次印象城影像AI诊断 → 却进了印象城列表)。适用全部召回场景,不止影像 AI。 - target_clinic_id = 患者最近一条 encounter/emr(到诊)所在诊所;无到诊记录兜底回退诊断诊所(不置空) - unchanged 分支(reason 未变)也就地改归属,不升版本 → 普通重算即可修复存量错分 - 批量 prefetch 修 uuid bug:patient_id IN (text 参数) 对 uuid 列在 PG 报类型错, 批量整体静默退回诊断诊所(修不动);改 = ANY(::uuid[])。本地 2470 患者全量重算后残留错分 0 - 单刷路径 resolveLastVisitClinic 直查 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
方案 A 落地(jvs-dw): - incremental_cron: '15 0,8-22/2 * * *'(08:15~22:15 每 2h + 过天 00:15; cron 小时域无 24,'0' 即用户说的"24点"次日凌晨轮) - 空轮短路:transactionsWritten=0 且 patientsUpserted=0 → 跳过 persona/org-tree/plan, 空轮成本收敛到每表一条 cursor 探查(秒级)。条件保守:患者主档变化不产事务但进画像,不跳。 背景:DW 当前每日 08:00 一批(实测 13:56 时三表 updated_date 仍停昨日 23 点), 日内轮询换来的是 ① DW 迟到/失败当天自愈(原等 24h)② 手动补摄自动收口 ③ 瑞尔 DW 计划提频 2h,PAC 先就绪。防重前提已具备:并发锁 + cursor 幂等 + 同行去重。 计划重算链路不动(空轮短路后不会被空跑)。 验证:cron 库实测 next 14 次触发序列正确;manifest 解析 auto_sync/cron 正常;tsc 干净。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
业务定调(张雪反馈):一线关注真金白银,应收对免费套餐/团购客严重虚高 (胡新丽:应收¥1,270 实付¥0;张弦:应收¥77,795 实付¥57,887)。 - jvs-dw payment.yaml:amount settlement_money(实付);friday:net_receipts_this - 新增 receivableAmount(应收)辅助字段:canonical schema 显式声明 + moneyFields 登记同口径归一 + payment_record.content.receivable_cents - discount-anchor 折扣率分母换 receivable_cents(旧事实 fallback amount_cents) - 顺带修掉两个隐藏口径 bug: ① refund 一直是实收冲减 → 原 LTV 实为"应收收入−实收退款"混口径,现自洽 ② 储值客户双计:充值(实付)计一次 + 扣卡消费应收又计一次,现扣卡单实付0不再重复 下游自动切换:profile.ltv(UI 累计消费)/ rfm.M 值 / lifecycle 消费档 → 实付口径。 金额守恒已对账(张弦 mode 表 17 行:实付57,887/应收77,795,无多通道重复计)。 上线步骤:部署后跑 reparse(rawPayload 完整保留源列,无需重拉 DW)→ persona 重算。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
第④问「以什么切入」:打电话的低门槛开口台阶,依据按优先级取第一个可用档: ① 医生计划/建议/医嘱(最优先,统一 verbatim 原话属性): - 治疗计划 subtype 原话(如「待22萌出后择期早期矫治」) - 医生建议 recommendation_record.name 原文 - 医嘱 emr_record.doctor_advice(2.2万条真实医嘱;≥6字过滤"常嘱"水词,取最近2条) 规则:必须优先引用「」原话要点(过长精简保留医嘱词),别只报大类; 通用套话(定期复查不适随诊)视同无原话降档;多条挑与召回原因最相关的一条 ② 洁牙/检查锚点(①为空才用):最近一次 preventive/periodontic 距今, 超6个月才可引用时间,不足视同没有 ③ 通用复查邀约(不带时间数字);严禁编"该洁牙了/上次洁牙已X个月" 防重复:同一天数整句只出现一次;锚点与召回原因"拖了X"同源时切入不再报数。 字数放宽 ≤65 最佳/90 上限;兜底模板同优先级;prompt 版本 2026-07-21-d。 注:已缓存旧简报不自动重生成,上线时按 type=recall_brief 清一遍缓存即可。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
merge: refactor/assembler-shared-dict → main(FRIDAY 摄入:共享字典分层 + 推送契约 + 关系边/咨询/退费三轨 + export cohort 过滤) # Conflicts: # apps/pac-service/tests/canonical-fact-layer.spec.ts
luoqi committed -
形态 A 的 15 个 source 字段定义,放接入板块、紧随 Push 通道(它是推送通道的宿主侧具体化)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed
-
- 20 Jul, 2026 18 commits
-
-
patient_relation / patient_return_visit 与 patient 同为 upsert 资源(不进 transaction,刻意无 emits,yaml 头注释已写明),但闸 3 豁免名单只有 patient → 两条误报失败(main 同样存在)。豁免集对齐 cold-import.service.ts subjectCfgs 排除集(patient/patient_relation/patient_return_visit)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
recall-suppression.spec 引用 7eb8dbed 三源标定重构中删除的 computeLikelihoodBonus, 套件加载失败(main 同样存在)。原 GAP2"considering 不加权"在 v3 由设计保证 (scorer 不再消费 execution outcome);该块改测 v3 确定性因子:置信度夹逼 [0.5,1]、 新鲜度过窗线性衰减至 0.4 地板、三维加权(急迫0.4/价值0.3/意愿0.3)、 K08/K03 牙数分档、信任封顶 10、总分 ≤100。snoozedUntil 部分 API 未变,原测保留。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
f60f4cca/4fe0d973 重构删除旧 script-facts 8 函数,旧 spec 成孤儿(套件加载失败)。 按现架构重写:shared/script-facts(智能日期/FDI俗称)、shared/pii(去名留称呼)、 shared/disease-knowledge(病种 canonical 名)、tiers/stable/phrasing(稳健档文案, 含 jaw_cyst 双字典 key 回归点)、shared/fact-block(厚输入事实块:全名不进 prompt/ 未成年拍片禁令/单一聚焦)。62 测锁行为。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
文件源宿主的诊所/时间过滤放导出侧(架构约定:host 端 dump 时过滤,PAC 不动): - cohort 源 = med_emr_info 正式病历(对齐 jvs-dw clinic_scope 挂 EMR 事实表); 只收窄患者名单,入选患者全部主体/跨诊所/全历史照常导出,谓词按患者求交非行级 AND - settlement_modes 无患者列经结算头单 IN 子查询挂靠(纪律放行形态) - SQL 走 stdin(cohort IN 列表会撞 ARG_MAX);空 cohort 拒跑防退化全量; cohort 内 0 行表合成表头(mysql --batch 空结果连表头都不出) - cold-import 文件源传 --clinics/--since 时显式警告(此前静默忽略) - refresh-clinic-names 改合并语义:子集导出不再刷掉子集外诊所名 实测(刘医生演示诊所 36 患者):EMR 53 份含 4 家其他诊所历史,零越界; dry-run 15 资源 746 txns 0 failed;空 cohort exit=1;0 行表合成表头可导入。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
品牌中文名当前只有模拟登录对话框一处会用,显示 GUID 足够;为它引入一个数据源 (tenant_apply.tenant_info)+ 一个 Host 字段 + 契约档 + CLI 分支 + session 合并, 收益不抵复杂度 → 整条链路撤回,只留诊所名(工作台真实展示位)。 - friday export.sh / manifest:删 tenant_info 导出与 brand_directory 声明 - manifest.schema:删 brand_directory;Host.sourceUnitNames 与其迁移一并删除 (分支未合未部署,本地 DROP COLUMN 即可,无需 down 迁移) - TokenDictionary 删 brands 档;auth.service 恢复 getClinicNames;controller 恢复原合并 - refresh-clinic-names CLI 恢复单字典派生 - listMockOrgs:品牌名直接用 source_unit id(诊所名仍派生自病历表 organization_name) - 契约文档:15 source 复原,「留意事项」加一条说明——品牌名未冗余进业务表, 将来若需展示再约定推主档 验证:tsc 0(svc+web);mock-orgs 19 品牌显示 id、诊所仍中文名;session 无 brands 键、 clinics 11 家照旧;jvs-dw 全程未受影响。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
对接方必然会问"诊所名随业务表白送,品牌名为何要单独推一张表"。实证:宿主把 organization_name 冗余进了 21 张业务表,而 tenant_name 只在两张投诉表(不在契约范围), 品牌名只存于 tenant_apply.tenant_info 主档 —— 故必须单独推,好在低频且仅 45 行级。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
对齐 2026-07-20 的新落地内容: - 新增 §2 `tenant_info` 品牌主档 source(品牌 GUID→中文名;PAC 靠它避免前端显示 GUID), source 总数 15→16 - `med_emr_info` / `med_check` 补 `organization_name` 列(诊所展示名来源;此前导出漏列, 导致工作台诊所显示 GUID) - 补回丢失的 §7:改为「语义澄清记录」——时间口径/金额/两套关系枚举/treat vs dispose/ 结算 status 全 9 值 + 为何不收 7/8,逐条附源码或数据依据;另列三条推送方留意事项 (organization_name 仅覆盖有病历的诊所、字典表全量重推、测试环境沙盒数据待生产校准) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
两宿主此前挤在一个面板(FRIDAY 只有一条集团级横条),数据概念互相干扰。改为宿主 tab: - 瑞尔集团(jvs-dw):原客服花名册路径,一字未动 - FRIDAY 市场:身份是造的(该宿主本就无客服花名册),但**数据范围必须真实** —— 品牌/诊所来自新端点 GET /auth/mock-orgs:结构取 org 树(派生自 patient_transactions), 名字取 host.sourceUnitNames / clinicNames(派生自摄入源),零硬编码 - 契约:MockLoginRequest 加 orgId(任意 org 节点 = 品牌 GUID / 诊所 id);新增 MockOrgs 响应 - service:listMockOrgs(org 树 + 名字典,有名品牌与多诊所品牌排前);friday 分支支持 orgScope=[orgId],不传则市场级 - web:FridayPanel(角色 + 市场级 + 真实品牌/诊所两级选择 + 搜索) 验证:FRIDAY tab 显示 19 品牌 / 35 诊所(瑞诚齿科 12 诊所、希尔德 3…);点"瑞诚齿科" 品牌级登录 → 右上角 12 个诊所、召回池由 11,723 收窄到 5 人、患者诊所均属该品牌 ✓; 瑞尔 tab 花名册与登录行为不变。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
FRIDAY 的 source_unit / clinic_id 都是 GUID(jvs-dw 是"瑞尔/瑞泰"中文名),工作台此前 只能显示 GUID。诊所名机制(host.clinicNames + clinic_directory + CLI 派生)本就存在且 支持文件源 —— 缺的是①导出漏了 organization_name 列 ②friday manifest 没配 directory ③品牌名没有对应机制。 - 契约:TokenDictionary 加 brands 档;Host 加 sourceUnitNames(对称 clinicNames, 迁移 20260720104938) - manifest:新增 brand_directory 声明(与 clinic_directory 同形) - CLI refresh-clinic-names 泛化:一次派生两类字典,单侧声明不误清另一侧;空结果不覆盖 - session:getDisplayNames 一次取两类,dictionary.brands 与 clinics 同款合并 (服务端派生打底、宿主换票传的覆盖优先) - friday export.sh:med_check/Mongo 补 organization_name,新增 tenant_info 品牌主档 (apply 服务 tenant_apply.tenant_info,列名实测 name/name_ab 非 short_name) -
⚠ ️ export.sh 加固:所有导出改 tmp→校验非空→mv,裸重定向在库抖动时会清空好文件 (2026-07-20 踩,62MB med_emr_info.json 被清零) 验证:派生诊所名 11 家 / 品牌名 45 个;friday session 下发 brands 45(成都安玉牙种植 医院/欣美/森德口腔)+ clinics 11;jvs-dw 对照 brands 键不下发、clinics 5 家照旧。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
工作台此前只能登 jvs-dw 租户,FRIDAY 摄入的 10.7 万患者 / 1.17 万召回计划无入口查看。 - MockLoginRequestSchema.tenant 加 'friday' - auth.service 独立 early 分支:host=friday / tenantId=friday-market / orgScope=['friday-market'](集团根 → 展开后 sourceUnits/clinicIds 均不限)。 多品牌 SaaS 无在岗花名册,mock 只做集团级;诊所名未摄入 → dictionary.clinics 空, UI 回退显示 id。jvs-dw 路径(MOCK_PRESETS)完全不变 - 弹窗集团级横条下加青色 FRIDAY 入口,角色沿用①所选 验证:mock-login 签发 token(hostId=friday/tenantId=friday-market)、瑞尔对照未受影响; 浏览器登入实测召回池 11,723 人,详情页画像 9 项 / 治疗历史 1,621 项 / 累计消费 ¥3,320 / AI 话术均正常。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
一、时间/金额实证(2026-07-20,契约文档同步): - 金额=元(洁治单价均值 ¥310/客单 ¥1,730 双证);MySQL datetime=北京墙钟(_gmt_ 命名惯例误导) -
⚠ ️ Mongo Date=北京墙钟伪装 UTC(clinicTime/createdGmtAt 小时分布双峰直读=营业时段;按真 UTC 解释一半病历落深夜)→ export.sh Date 改直读墙钟输出 naive 字符串;EMR 链 35.6 万 fact 清层重灌校正(-8h),修后小时分布恢复营业双峰。契约文档明令宿主 push 勿 toISOString 带 Z 二、官方字典(friday-saas 源码考古,待确认清单清零): - contacts.relationship = PhoneRelationshipEnum(1本人…9其他)→ patient.yaml 解码, preferences.contactPhone 带 relationship 标签(mother/father…) - referee_relationship = RecommendRelationshipEnum 17 码;reverseValue+年龄差数据双证 语义方向=customer 是 referee 的 X → patient_relation.yaml 按逆关系重写(码8 其他亲属 纠正 friend→other;新增 5/6/11/12/13/15/16 映射;码3 按对方性别拆 father/mother)。 关系表清层重灌:friend 3,511→541(纯码7),官方映射干净落地 - settlement status 全 9 值:实体注释 7=流程结束/8=欠款补缴克隆单(savePatientSettlementQk 证实 receivable 原样复制→入消费必双计)→ 现行不收 0/2/5/6/7/8 全部获官方背书 - treat=本次治疗/dispose=处置(EmrInfoResDto 注释);预约 status 7=到诊患者变更 三、患者主档 push(此前 form A 仅支持 fact 资源): - patient-upsert.util:upsert 数据构造抽纯函数,full(cold-import 历史语义,分毫不变)/ partial(push 单表:未提供字段不进 update 集合、phone 永不合成假号)双语义 —— 解决 push 单表时 contacts lookup 缺席导致存量真号被假号覆盖的根因 - ingestRawTables 路由 upsert 资源(patient partial/patient_relation/patient_return_visit); 纯主档推送不产 txn 不触发重算(注释明示) - 测试 8/8(partial 不覆盖/无清空语义/preferences 透传);E2E 冒烟:push 单行改名, 存量 phone 15725591111 原样保留 ✓。契约文档待确认清单清零 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
原测试只豁免 patient,后来新增的 upsert 资源 patient_relation/patient_return_visit (设计上无 emits)一直误报;friday/patient_relation.yaml 落地后同一缺陷第三次命中。 豁免集合改为与 importDirectory 排除 subjectCfgs 的三元组一致。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
luoqi committed
-
luoqi committed
-
原 occurredAt ?? new Date() 在 occurredAtField 缺失/不可解析时每次摄入产生新墙钟值 — 时间锚纳入 fact 变更检测后会被放大成伪 supersede 版本抖动。改为确定性回退链 (occurredAtField → updatedAt → createdAt),三者皆缺才落墙钟并 warn。含回退顺序测试。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
FactWriter 此前只比 content hash + status:occurredAt/plannedFor/validFrom/validUntil 不参与 → 宿主纠正事件时间(如 FRIDAY 伪 UTC 整体 -8h)重摄永远 evidence_appended, 时间锚永不更新。时间锚是时间轴/召回窗口 COALESCE(occurred_at,planned_for)/过期 cron 的直接输入,属事实实质 → 纳入等值判定(毫秒精度,双 null 视为等),单写与 bulk 两路同步。 不纳入 title/summary(展示层)。含 supersede 传导测试。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
宿主动作派发(host-message 重写): - actionUrls.OPEN_RETURN_VISIT / OPEN_POTENTIAL_TREATMENT 值形态定模式: 未配置=按钮不渲染 / URL 模板=跳转(推荐) / 哨兵 postMessage=喊宿主父页(需 HOST_ORIGIN) - 哨兵比较大小写不敏感(裸词不可能是合法 URL,宽容拼写零误伤) - 管理页:配哨兵缺 HOST_ORIGIN 时黄条提示 宿主回访模式布局(有回访按钮时): - 通话结果整列隐藏(xl 收 2 列,窄屏去「操作」tab);召回反馈拇指隐藏,宠物引导同停 - 顶栏「关闭」危险按钮 → 关闭机会弹窗(7 原因,PAC UI 标准) 关闭机会闭环(CLOSE_REASON_META 单一真理源,前后端同表): - 原因→outcome 映射:无意愿/价格=refused(90d)、竞品=external_treatment(永久)、 无法联系=abandoned(30d 熔断口径)、已治/其他=abandoned(14d 默认档)、 识别不准=marked_invalid(覆写永久→14d)+ 双写召回反馈 down - resolveSnoozedUntil 优先级链插入 closeReason 覆写档(熔断 > 覆写 > outcome 自带) - 复用 execution 通道(channel=other),状态机/触达账本/跨栏同步全继承 - 关闭后自动跳下一位(我的进行中 → 召回池,与 /plans 入口解析器同规则) 列表口径对齐: - 终态单(completed/abandoned)在 pool/mine 视图原地剔除(与服务端过滤一致) - 「我的」显式 status=assigned(服务端 view=mine 返全状态是旧列表页设计) 其他:全局细滚动条(Windows 默认过粗);删 spec 中引用已重构掉的 computeLikelihoodBonus 的过时测试块(main 上即已编译失败);新增 7 个 closeReason 抑制覆写测试(19/19 过) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
- .design-sync/:config(锚定 PAC Design System 项目)+ 18 个富预览 + 用法约定 + NOTES - src/ds/index.ts:设计系统导出桶(ui 全集 + plan-detail 原语 + toast) - ui/*.tsx、shared.tsx:补 JSDoc(@category 分组,转换器生成 prompt.md 用) - .gitignore:忽略同步暂存/构建产物 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed
-