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>
21 KiB
MeMind Health P0 前置实验方案(14 天人工实验)
日期:2026-09-02 状态:可执行方案。不涉及业务代码改动,不碰生产链路。 上游文档:memind-health-architecture.md §14
1. 为什么先做这个实验
在写任何健康平台代码前,必须先验证两件事:
- 用户会不会持续录入(依从性)—— 这是产品的生死线。没有连续数据,基线永远不成熟,Event Engine 永远不起作用,整套架构价值归零。
- 基线偏离是否真的早于主观察觉 —— 这是产品的核心命题。
这两件事不需要任何平台代码就能验证。实验成本极低,但能避免在错误方向上投入数月开发。
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 Data(Page 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(如 P01–P10)区分身份,无需账号。
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%。」
注意:D8–D14 观察期不得向参与者透露偏离判定,否则污染 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 D8–D14 偏离标记
每天对晨间收缩压做双重判定:
相对偏差: 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. 与后续开发的衔接
实验结束后应产出四份交付物:
- 实验结论报告(含 §9 全部表格 + 决策矩阵结论)
- 偏离阈值标定值 → 写回架构文档 O6
- 照片校验集 → 归档为 P0
health-extraction.test.mjs的固定用例 - 入口形态结论 → 决定 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. 相关文档
- memind-health-architecture.md — 上游架构设计
- page-data-api-usage.md — Page Data API
skills/page-data-collect/SKILL.md— 建表与页面绑定规范