Files
memind/docs/memind-health-p0-experiment.md
T
john f96fdcb3b9 feat(health): add P0 health channel kernel and encrypted health zone.
Lock health recording behind confirm-only state machines, reject public publishes for the health category, and ship the 14-day experiment Page Data templates with tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 18:04:26 +08:00

21 KiB
Raw Blame History

MeMind Health P0 前置实验方案(14 天人工实验)

日期:2026-09-02 状态:可执行方案。不涉及业务代码改动,不碰生产链路。 上游文档:memind-health-architecture.md §14


1. 为什么先做这个实验

在写任何健康平台代码前,必须先验证两件事:

  1. 用户会不会持续录入(依从性)—— 这是产品的生死线。没有连续数据,基线永远不成熟,Event Engine 永远不起作用,整套架构价值归零。
  2. 基线偏离是否真的早于主观察觉 —— 这是产品的核心命题。

这两件事不需要任何平台代码就能验证。实验成本极低,但能避免在错误方向上投入数月开发。

1.1 实验的额外产出(同等重要)

除验证假设外,本实验还应顺带产出三项 P0 开发的必要资产:

产出 用途
设备照片校验集 health-extraction.test.mjs 的回归用例,防止换模型后精度回退
真实偏离阈值 标定 O6,替代凭空设定的百分比
入口摩擦排序 决定 H5 与服务号谁是留存主战场

2. 假设与结局指标

2.1 主结局(一定可测,决定是否继续)

H1 依从性:用户能否在无强制手段下连续 14 天录入晨间血压。

主指标:14 天晨间血压录入完成率 = 实际录入天数 / 14

成功阈值:≥ 3/5 参与者完成率 ≥ 80%(即 ≥ 12/14 天)
警戒线:  若 ≥ 3/5 参与者完成率 < 50%,P0 入口形态必须重新设计

2.2 次结局(可能无法判定,需预设应对)

H2 核心命题:手工基线偏离标记是否早于用户主观察觉。

指标:首次偏离标记日期 vs 用户主观首次察觉日期

成功阈值:≥ 3/5 参与者出现「标记早于主观察觉 ≥ 3 天」

重要风险14 天内健康人群可能完全没有偏离,导致 H2 无法判定。这是本实验最可能的失败模式,必须提前应对(见 §3.2 招募策略、§7.3 无偏离处理)。

2.3 探索性观察(不设阈值,仅记录)

  • H3 摩擦:不同录入渠道的实际使用比例与放弃点。
  • H4 数据质量:手输 vs 拍照的一致性;用户是否记错测量时间。
  • H5 联动:睡眠时长与次日晨间血压是否存在个体内相关。

3. 参与者

3.1 样本量

建议:8–10 人(原方案 5 人对 H2 统计力不足)
最低:5 人(仅能验证 H1,H2 视为探索性)

若只能招募 5 人,必须明确:H1 是主结局,H2 降级为探索性观察,不以 H2 结果决定项目走向。

3.2 招募策略(针对 H2 风险)

单纯招健康人,14 天内很可能零偏离。应有意纳入更可能出现波动的人群

优先纳入 理由
血压偏高但未服药(正常高值) 波动概率高
作息不规律 / 经常熬夜 睡眠-血压联动可观察
50 岁以上 基线漂移概率高
有服药且近期可能调整 药物变化是天然扰动

排除

  • 服用降压药且血压被严格控制的(波动被药物压平)
  • 无法自行完成测量的
  • 近期计划手术/住院的

混合建议:6 人「可能波动」+ 2–4 人「相对健康」作为对照。

3.3 知情同意(必须书面确认)

参与前必须明确告知并留存确认记录:

1. 本实验为产品可行性研究,不提供任何医疗诊断或治疗建议
2. 若测量值异常或身体不适,请立即就医,不要等待实验结论
3. 数据仅用于本次产品研究,不对外提供,实验结束后可要求删除
4. 可随时无理由退出,退出不需要解释
5. 实验期间不会有人替你判断健康状况

特别强调第 2 条:实验中若出现 SpO₂ < 90%、收缩压 ≥ 180、舒张压 ≥ 110 或明显症状,研究者必须立即建议就医并终止该参与者实验。这是伦理底线,不能因为"要收集数据"而延迟。


4. 测量规程(数据质量的核心)

这一节是整个实验的关键。「参差不齐」的根源就是测量规程不统一 —— 若此处松散,后面所有基线计算都无意义。

4.1 晨间血压(必测,主指标来源)

时间:起床后 1 小时内,且服药前(若有服药)
准备:排空膀胱 → 静坐休息 5 分钟
姿势:坐姿,背有支撑,双脚平放,不交叉腿
袖带:同一侧上臂(固定左或右,全程不换),袖带下缘距肘窝 2–3cm
      袖带与心脏同高
测量:连续测 2 次,间隔 1 分钟,记录第 2 次读数
禁忌:测量前 30 分钟内不吸烟、不饮咖啡/浓茶、不运动
记录:收缩压 / 舒张压 / 脉搏 / 实际测量时刻

固定同一侧手臂很重要 —— 双臂血压可差 5–10 mmHg,换臂会直接制造假偏离。

4.2 晚间血压(可选但推荐)

时间:睡前 1 小时内
其余规程同晨间

4.3 睡眠时长

记录:入睡时间(估计)+ 起床时间 → 计算时长
精度:15 分钟取整即可,不要求精确
若有手表/手环数据:优先用设备数据,并注明来源

4.4 症状

每日勾选(可多选,无症状则选"无"):
无 / 头晕 / 头痛 / 胸闷 / 心慌心悸 / 乏力 / 气短 / 下肢水肿 / 失眠 / 其他

每个勾选项标注严重度:轻 / 中 / 重

固定枚举而非自由文本 —— 否则无法做 cluster 分析(对应架构文档 O1)。

4.5 体重(隔日)

时间:晨起排空后,空腹,同一体重秤
着装:尽量一致(如仅内衣)
频率:隔日即可,不必每天

4.6 扰动因素(每日记录,用于关联分析)

昨日是否饮酒:无 / 少量 / 较多
昨日情绪压力:低 / 中 / 高
用药变化:无 / 新增 / 停用 / 剂量调整(注明)
其他:感冒、发烧、加班、旅行等(自由备注)

这一项是 H5 联动假设的关键。 没有扰动记录,就无法解释偏离原因。

4.7 设备照片(用于建校验集)

请参与者在每次晨测后额外拍一张血压计屏幕照片,通过微信发给研究者。

要求:
- 屏幕完整可见,不要求角度端正(正是要收集"不完美"样本)
- 不同光照、不同角度、有反光的都要,越多样越好
- 若屏幕显示时间,请一并拍进去

用途:作为 P0 拍照识别的回归校验集。照片与其手工录入的数值配对,
      形成 (图片 → 正确值) 标注对,可直接用于 health-extraction 测试。

这是本实验最被低估的产出。 真实设备照片标注集很难获得,而它直接决定 P0 拍照识别能否达到 98% 准确率。照片单独收集,不进 Page DataPage Data 不适合存文件)。


5. 录入工具

5.1 方案:Page Data 匿名问卷页(方案 A)

用现有 page-data-collect 能力搭建,无需任何新代码。仓库已提供可直接 bind 的模板:

  • templates/health-p0-log.html(参与者录入)
  • templates/health-p0-admin.html(研究者口令后台)

对应 SQL、dataset 与 bind 规格在 health-p0-experiment.mjs

选择方案 A(匿名 insert + 口令后台)而非登录方案,理由:参与者无需注册登录,摩擦最低。这也顺带测试了「零登录摩擦」下的依从性上限。

参与者页:public 模式,仅 insert
研究者页:password 模式,仅 read

参与者用 participant_code(如 P01P10)区分身份,无需账号。

5.2 建表 SQL

CREATE TABLE IF NOT EXISTS health_p0_daily_log (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  participant_code TEXT NOT NULL,
  log_date DATE NOT NULL,

  -- 晨间血压(必填)
  am_measured_at TEXT NULL,          -- 实际测量时刻,如 "07:20"
  am_systolic INT NULL,
  am_diastolic INT NULL,
  am_pulse INT NULL,

  -- 晚间血压(可选)
  pm_measured_at TEXT NULL,
  pm_systolic INT NULL,
  pm_diastolic INT NULL,
  pm_pulse INT NULL,

  -- 睡眠
  sleep_start TEXT NULL,
  sleep_end TEXT NULL,
  sleep_minutes INT NULL,
  sleep_source TEXT NULL,            -- self_estimate | device

  -- 体重(隔日)
  weight_kg NUMERIC(5,1) NULL,

  -- 症状(JSON 数组,含严重度)
  symptoms JSONB NOT NULL DEFAULT '[]'::jsonb,

  -- 扰动因素
  alcohol TEXT NULL,                 -- none | light | heavy
  stress TEXT NULL,                  -- low | mid | high
  medication_change TEXT NULL,       -- none | added | stopped | dose_changed
  medication_note TEXT NULL,
  other_note TEXT NULL,

  -- 元信息
  entry_channel TEXT NULL,           -- h5_form | wechat_manual | other
  photo_sent BOOLEAN NOT NULL DEFAULT FALSE,
  created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted_at TIMESTAMPTZ NULL
);

CREATE INDEX IF NOT EXISTS idx_p0_participant_date
  ON health_p0_daily_log (participant_code, log_date DESC);

5.3 Dataset 注册

{
  "name": "health_p0_daily_log",
  "table": "health_p0_daily_log",
  "description": "MeMind Health P0 前置实验每日记录",
  "actions": ["read", "insert"],
  "columns": {
    "read": ["id", "participant_code", "log_date", "am_measured_at", "am_systolic", "am_diastolic", "am_pulse", "pm_measured_at", "pm_systolic", "pm_diastolic", "pm_pulse", "sleep_start", "sleep_end", "sleep_minutes", "sleep_source", "weight_kg", "symptoms", "alcohol", "stress", "medication_change", "medication_note", "other_note", "entry_channel", "photo_sent", "created_at"],
    "insert": ["participant_code", "log_date", "am_measured_at", "am_systolic", "am_diastolic", "am_pulse", "pm_measured_at", "pm_systolic", "pm_diastolic", "pm_pulse", "sleep_start", "sleep_end", "sleep_minutes", "sleep_source", "weight_kg", "symptoms", "alcohol", "stress", "medication_change", "medication_note", "other_note", "entry_channel", "photo_sent"]
  }
}

5.4 页面绑定

// 参与者录入页
{
  "relativePath": "public/health-p0-log.html",
  "accessMode": "public",
  "datasets": {
    "health_p0_daily_log": {
      "insert": true,
      "read": false
    }
  }
}

// 研究者查看页(独立文件)
{
  "relativePath": "public/health-p0-admin.html",
  "accessMode": "password",
  "password": "<设置 ≥6 位口令>",
  "datasets": {
    "health_p0_daily_log": {
      "insert": false,
      "read": true
    }
  }
}

注意:参与者页与研究者页必须是两个 HTML 文件、各 bind 一次。同页不能同时「匿名 insert」+「口令 read 全量」(平台硬约束)。

5.5 表单设计要点(直接影响 H1

录入页必须做到60 秒内完成,否则依从性数据不可信:

  • participant_code 首次输入后记住(用 URL 参数传递,如 ?p=P01不用 localStorage,平台禁止)
  • log_date 默认今天
  • 数值输入用 type="number" + inputmode="numeric",唤起数字键盘
  • 症状默认选中「无」,多数天一键跳过
  • 晚间血压、体重、扰动因素默认折叠,不展开不影响提交
  • 提交后立即显示「已记录第 N 天」+ 本人历史晨间血压范围(给即时回报,见 §6.3)

6. 执行流程

6.1 时间线

D-3 ~ D-1  招募、知情同意、发放测量规程、确认设备可用、试录 1 次
D1  ~ D7   基线建设期:每日录入,不做任何偏离反馈
D8         中期分析:手工计算 7 天基线(研究者侧,不告知参与者)
D8  ~ D14  观察期:每日录入,研究者每日手工标记是否偏离(不告知参与者)
D14        盲态访谈(关键:必须在告知任何系统判定前进行)
D15        揭盲、对比、结论

6.2 每日提醒

由研究者手工发送(不做自动化),固定时间:

早 07:00  「早上好,起床后 1 小时内测量血压,记得静坐 5 分钟。[录入链接]」
晚 21:00  (仅对当日未录入者)「今天还没有记录,方便补录吗?」

同时记录提醒效果:有多少天是提醒后才录的、有多少天是主动录的。这直接反映真实依从性 —— 若 90% 依赖提醒,说明产品必须有可靠推送机制(而这恰恰是弱项,见架构文档 O5)。

6.3 基线建设进度反馈(H1 的关键干预)

用户录了 7 天什么反馈都没有,必然放弃。所以 cold 期必须给非偏离类的即时价值:

D3  「已连续记录 3 天。你的晨间收缩压目前在 122–128 之间。」
D7  「7 天记录完成。初步基线:118–126 / 72–78。继续记录将开启趋势观察。」
D10 「已记录 10 天,数据完整度 100%。」

注意D8D14 观察期不得向参与者透露偏离判定,否则污染 D14 盲态访谈。进度反馈只说「记录了多少天」和「基线范围」,不说「你最近偏高」。

6.4 退出处理

参与者中断时,必须记录:

- 中断发生在第几天
- 是否有明确原因(忘记 / 麻烦 / 出差 / 设备问题 / 不想继续 / 其他)
- 是暂停还是彻底退出

中断本身就是最有价值的数据。 不要试图挽留 —— 挽留会污染依从性测量。


7. 分析方法

7.1 D8 基线计算

对每位参与者,用 D1–D7 的晨间数据计算:

n            有效天数(缺失不补)
mean         均值
std          样本标准差
min, max     极值
p25, p75     四分位
typical      建议表示为 round(p25)  round(p75)

分别计算收缩压与舒张压,不合并。

若某参与者 D1–D7 有效天数 < 5,标记为「基线不可用」,该参与者 H2 不参与判定(但仍计入 H1)。

7.2 D8D14 偏离标记

每天对晨间收缩压做双重判定:

相对偏差: dev% = (value - mean) / mean × 100%
标准分:   z    = (value - mean) / std

单日标记条件(满足任一):
  dev% ≥ +5%   或   z ≥ +1.5

持续偏离标记(首次偏离日期以此为准):
  连续 ≥ 2 天出现同向单日标记

为什么用双重判定:相对偏差直观但忽略个体变异性;z 分数考虑变异性但小样本下 std 不稳。两者取或,宁可多标记,后续人工复核。

记录每位参与者的「首次持续偏离日期」,这是与主观察觉对比的关键值。

同时对睡眠做同样计算(方向相反:dev% ≤ -15%z ≤ -1.5),用于观察 H5 联动。

7.3 无偏离情况的处理(必须预设)

若某参与者 D8–D14 完全无偏离标记:

不算失败,记录为「稳定期」。

处理:
1. 该参与者不参与 H2 主判定
2. 但需确认其 D14 主观回答也是「和平时一样」
   → 若主观也说一样 → 这是一次正确的"真阴性",同样有价值
   → 若主观说"不太一样"但系统无标记 → 这是漏检,必须深挖原因

漏检比误报更值得研究。 若用户明确感到变化而基线检测不到,说明指标组合或窗口选择有问题 —— 这是本实验最有价值的发现之一。

全部参与者均无偏离,则 H2 无法判定。此时:

1. H1 结论仍然有效,可据此决定 P0 入口形态
2. H2 需延长观察至 30 天,或扩大样本,或调整招募标准
3. 不得因 H2 无结论就否定整个项目方向

7.4 计算工具

D8 与 D14 的计算量很小(每人 7–14 行数据),用 Excel / Numbers 即可,不需要写代码:

mean:  =AVERAGE(range)
std:   =STDEV.S(range)
p25:   =QUARTILE.INC(range, 1)
p75:   =QUARTILE.INC(range, 3)
dev%:  =(value - mean) / mean
z:     =(value - mean) / std

保持手工计算的另一个好处:逼迫研究者逐个看数据,容易发现异常模式(如某人明显记错时间、某天数值突变),这是自动化脚本会掩盖的。


8. D14 盲态访谈脚本

执行纪律:访谈必须在告知任何判定结果之前完成。研究者不得在访谈中透露「你最近偏高」之类信息,否则 H2 结论无效。

按顺序提问,不要跳问,不要引导

Q1(开放,不提任何指标)
   「这两周,你觉得自己的身体状态和平时一样吗?」
   → 记录原话

Q2(仅在 Q1 回答"不太一样"时问)
   「大概从哪天开始感觉不一样的?」
   → 记录具体日期或"第几天左右"
   → 这是"主观首次察觉日期"

Q3(不一样的具体表现)
   「具体是哪里不太一样?」
   → 记录原话,不要提示选项

Q4(扰动因素回溯,此时才可提具体项)
   「这两周有没有出现:失眠、感冒、饮酒增加、情绪压力大、
     用药变化、加班或作息改变?」
   → 逐项确认,记录时间范围

Q5(录入体验,H1/H3)
   「每天记录这件事,麻烦吗?哪一步最烦?」
   「如果没有我提醒,你觉得自己能坚持吗?」
   「你更愿意用哪种方式记录:网页表单、微信拍照、还是别的?」

Q6(价值感知)
   「这两周的记录,对你有用吗?有用在哪里?」
   「如果有个助手能告诉你'最近和以前不一样',你会想用吗?」

Q7(继续意愿)
   「实验结束后,你会继续记录吗?为什么?」

访谈结束后才可揭盲,告知手工分析结果,并观察其反应(这本身是对 Agent 话术的预演)。


9. 数据记录模板

9.1 参与者台账

编号 年龄段 纳入类型 设备型号 起止日期 晨测完成天数 完成率 中断天 中断原因 状态
P01 可能波动/对照 /14 完成/退出

9.2 基线与偏离结果

编号 有效基线天数 SBP mean SBP std SBP typical 首次持续偏离日 主观首次察觉日 提前天数 判定
P01 D__ D__ / 无 命中/漏检/真阴性/不可判定

9.3 依从性明细

编号 主动录入天数 提醒后录入天数 未录入天数 平均录入耗时 主要渠道

9.4 照片校验集

照片编号 参与者 日期 手工录入值 屏幕是否有时间 光照/角度备注

10. 决策矩阵:实验结果如何影响 P0

H1 结果 H2 结果 结论与行动
完成率高 命中 全速推进 P0,按架构文档执行
完成率高 无偏离/不可判定 推进 P0,但延长 H2 观察至 30 天;P1 引擎暂缓
完成率高 漏检为主 推进 P0,但必须先重新设计指标组合与窗口再做 P1
完成率低 任意 暂停 P0,先解决入口摩擦:优先做设备自动同步(原 P2 提前),或彻底简化录入形态
大面积中断 任意 重新评估产品前提:手动录入路线可能不可行,需以设备接入为第一形态

最重要的判断:如果 H1 失败(大家坚持不下来),那么再精妙的基线算法都没有意义。此时正确的反应不是「优化算法」,而是把设备自动同步提到第一优先级,因为它是唯一能把录入成本降到零的手段。


11. 与后续开发的衔接

实验结束后应产出四份交付物:

  1. 实验结论报告(含 §9 全部表格 + 决策矩阵结论)
  2. 偏离阈值标定值 → 写回架构文档 O6
  3. 照片校验集 → 归档为 P0 health-extraction.test.mjs 的固定用例
  4. 入口形态结论 → 决定 H5 与服务号的主次关系

11.1 实验数据的处置

实验用 health_p0_daily_log 表与页面在结论产出后:

1. 导出结论所需数据 → 归档
2. 应参与者要求删除其数据
3. 关闭 dataset 的公开访问(private_data_close_page_dataset
4. 下线两个实验页面

不要把实验表直接当作 P0 的生产表 —— 字段设计目标不同(实验表是宽表便于人工分析,生产表是原子观测便于聚合)。


12. 实验本身的风险

风险 影响 对策
14 天内无人偏离 H2 无法判定 招募倾向波动人群(§3.2);预设无偏离处理(§7.3)
提醒污染依从性 H1 高估 分别统计主动/提醒后录入(§6.2
访谈引导 H2 无效 严格盲态,先访谈后揭盲(§8
测量规程不统一 假偏离 规程书面化 + 试录 1 次 + 固定同侧手臂(§4.1)
参与者出现真实健康问题 伦理风险 预设终止阈值,立即建议就医(§3.3
样本量过小 H2 统计力不足 争取 8–10 人;否则 H2 降级为探索性

13. 相关文档