diff --git a/CLAUDE.md b/CLAUDE.md
index de83cb8..ca270c0 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -104,3 +104,13 @@ pnpm deploy:server # 部署后端到生产环境
- 累计上课、本月上课、剩余课时集中在我的会员卡页面,个人资料卡不重复展示汇总。
- 次数限制以 remainingTimes 是否为 null 判断,不能按卡种推断。次数进度表示已用占总次数,已用包括预约占用;不限次卡不伪造耗课数。
- 会员卡加载失败显示重试,不当作无卡;会话变化时丢弃旧请求结果。
+
+### 课后评价与成长档案
+- 评价归属 booking 模块,档案归属 user 模块;共享契约放 shared/src/types/member-care.ts,页面沿用 booking/profile/admin 目录,不新增顶层业务目录。
+- COMPLETED 后立即可评价,无 24 小时截止;完成后 24 小时仅提醒未评价预约。唯一 bookingId 防重复,提醒状态保存在 Booking 上,定时任务原子领取,未知发送结果不自动重发。
+- 星级均分与 NPS 分开:NPS 仅使用可选 0–10 推荐意愿(9–10 推荐者、0–6 贬损者),按中国自然月聚合并展示样本数。
+- 教练私密笔记必须在服务端过滤;课程批注必须属于该学员的已完成预约。体测允许缺项,不以缺项当 0;累计课时包含有效补录,里程碑为 10/30/50 节。
+- 照片仅用于学员与馆主之间的档案展示,不能用于公开宣传。学员本人按照片授权/撤回,馆主不能代授权。与馆图共用 COS 桶,对象前缀 `progress/`,上传为私有 ACL,读取用短时签名,禁止落库公共链接;上传凭证绑定学员及照片记录。
+- 新增迁移目录只放 migration.sql,测试沿用各模块 __tests__;部署配置与验收清单放 docs/member-care.md。
+
+- 成长档案的两端共用 `components/MemberProgress.vue`,仅此跨端组件直接请求 progress API,避免主包引用 admin 分包 Store;馆主评价页面仍通过 admin Store 访问。
diff --git a/docs/member-care.md b/docs/member-care.md
new file mode 100644
index 0000000..e79bcbd
--- /dev/null
+++ b/docs/member-care.md
@@ -0,0 +1,41 @@
+# 课后评价与成长档案
+
+入口:预约详情评价、个人中心「我的成长档案」、管理中心「课后评价」与会员档案「成长档案」。评价归属 booking 模块,档案归属 user 模块。共享契约在 `packages/shared/src/types/member-care.ts`。
+
+## 产品口径
+
+- 课程变为 COMPLETED 后即可评价,没有 24 小时截止。完成后 24 小时只提醒仍未评价的预约。
+- 同一预约只能评价一次。提醒状态写在 Booking 上,定时任务原子领取;发送结果未知或失败不自动重发。
+- 星级均分与 NPS 分开。NPS 只用可选的 0–10 推荐意愿(9–10 推荐者、0–6 贬损者),按中国自然月聚合并展示样本数。
+- 教练私密笔记只在服务端过滤。课程批注必须属于该学员的已完成预约。
+- 体测允许缺项,缺项不按 0 计算。累计课时含有效补录,里程碑为 10 / 30 / 50 节。
+- 成长照片仅用于学员与馆主之间的档案,不用于公开宣传。学员本人授权或撤回,馆主不能代授权。误传或学员主动删除会同时删除数据库记录和 COS 对象。
+
+## 部署配置
+
+新增环境变量(见 `packages/server/.env.example`):
+
+| 变量 | 作用 |
+| --- | --- |
+| `WX_SUBSCRIBE_TEMPLATE_CLASS_REVIEW` | 课后评价订阅消息模板 ID |
+
+成长照片与馆图共用 `COS_BUCKET`、`COS_SECRET_ID`、`COS_SECRET_KEY`、`COS_REGION`。对象写在 `progress/{userId}/` 下,上传带私有 ACL,读取用约 60 秒签名 URL,不落库公共链接。小程序合法域名沿用现有 COS 域名即可。
+
+评价提醒模板字段由服务端按预约填充:`thing1` 课程名称(工作室名)、`thing2` 课程教练(Iris)、`time3` 课程时间、`thing4` 温馨提示。未配置模板 ID 时定时任务不领取预约。
+
+回退:先回退应用代码。新增表可保留;`progress/` 下对象不会被旧代码读取。不要在生产直接 `DROP TABLE`。
+
+## 迁移
+
+目录 `packages/server/prisma/migrations/20260909120000_member_care/migration.sql`。发布时先 `prisma migrate deploy`,再发布后端,最后发布小程序。
+
+## 验收清单
+
+- 学员在 CONFIRMED 或 COMPLETED 且未评价时都可以订阅提醒;核销后仍能订阅。
+- 完成后可立即评价;重复提交返回已评价。
+- 首页匿名均分不含评论文案;管理端趋势按中国自然月,NPS 与星级分开展示。
+- 私密笔记学员不可见;馆主在学员授权前不能读取照片,授权后可看,撤回后不能再签发。
+- 误传照片可删除,删除后档案和 COS 对象都不再保留。
+- 体测可只填一项,柔韧度允许负值;累计课时含未撤销补录。
+- 未配置评价模板时,定时任务不领取预约。
+- 小程序真机确认可上传、可用签名链接预览成长照片。
diff --git a/packages/app/src/components/ClassReviewForm.vue b/packages/app/src/components/ClassReviewForm.vue
new file mode 100644
index 0000000..5f8e563
--- /dev/null
+++ b/packages/app/src/components/ClassReviewForm.vue
@@ -0,0 +1,76 @@
+
+
+ 课后 · 留一点感受
+ 这节课,感觉怎么样?
+ 文字与标签仅你和馆主可见;星级会计入首页匿名均分。
+ 正在读取评价…
+ {{ error }}
+
+ {{ '★'.repeat(review.rating) }}{{ '☆'.repeat(5 - review.rating) }}
+ {{ tag }}
+
+ 已评价 · {{ formatChinaDate(review.createdAt) }}
+
+
+
+ {{ rating ? labels[rating - 1] : '轻触星星,为这节课评分' }}
+
+ 可选,最多 3 个标签
+
+ {{ comment.length }} / 200
+ 你有多愿意推荐我们?{{ recommendation < 0 ? '选填 ›' : recommendation + ' / 10 ›' }}
+ 0 表示完全不愿意,10 表示非常愿意
+
+
+ 课程完成后即可评价。
+
+
+
+
diff --git a/packages/app/src/components/MemberProgress.vue b/packages/app/src/components/MemberProgress.vue
new file mode 100644
index 0000000..7526661
--- /dev/null
+++ b/packages/app/src/components/MemberProgress.vue
@@ -0,0 +1,172 @@
+
+
+ 正在翻开成长档案…
+ {{ error }}
+
+
+ PRACTICE JOURNAL
+ {{ admin ? archive.nickname + '的练习记录' : '每一次练习,都算数。' }}
+ {{ archive.completedCount }}节累计练习
+ 包含有效历史补录 · 不急,慢慢感受身体的变化
+
+
+
+ 身体的刻度
+ 数字只是观察的一部分,无论增减,都与你一起了解身体。
+ 还没有体测记录由教练记录体测,变化会在这里慢慢呈现。
+
+
+
+ {{ latestValue ?? '—' }}{{ activeField.unit }}{{ metricDelta }}
+ {{ point.value }}{{ point.date }}
+ 这项指标尚无记录
+ 最近 6 次有效测量 · {{ activeField.label }}({{ activeField.unit }})
+
+
+ {{ formatChinaDate(metric.recordedAt) }}
+ {{ field.label }}{{ metric[field.key] == null ? '—' : metric[field.key] + ' ' + field.unit }}
+ {{ metric.remark }}
+
+
+
+
+ {{ admin ? '教练笔记' : '教练寄语' }}
+ {{ admin ? '私密笔记仅馆主可见,开启共享后学员才能看到。' : '留住被看见的进步,也记下下一次练习的方向。' }}
+ 静待第一份练习寄语教练分享的课后反馈会留在这里。
+
+ {{ note.shared ? '教练寄语 · 学员可见' : '私密 · 仅馆主可见' }}
+ {{ note.content }}
+ 课程 · {{ formatChinaDate(note.booking.timeSlot.date) }} {{ note.booking.timeSlot.startTime }}
+ {{ formatChinaDate(note.createdAt) }}
+
+
+
+ 看见变化
+ {{ admin ? '请先征得学员拍摄与上传同意。上传后由学员在自己的档案中授权展示。' : '照片仅用于你与馆主之间的档案。你可以先私下预览,再决定是否授权馆主查看,随时撤回。' }}
+ 还没有成长照片保持相近的角度与光线,更容易看清变化。
+
+
+
+ {{ formatChinaDate(photo.recordedAt) }}{{ photo.caption || '练习记录' }}
+ {{ photo.consentedAt ? '已授权馆主查看' : photo.revokedAt ? '已撤回授权' : '尚未授权展示' }}
+
+
+
+
+
+ 成长对照{{ photo.date }}
+
+
+ 值得纪念的时刻
+ 每个小小的坚持,都值得被认真收藏。
+ A MOMENT TO REMEMBER{{ n }}节{{ milestoneTitles[n] }}{{ archive.milestones.includes(n) ? '你已走过这段旅程' : '还差 ' + (n - archive.completedCount) + ' 节,一步步来' }}
+
+
+
+ {{ editor === 'metrics' ? '记录身体刻度' : editor === 'notes' ? '写一份教练笔记' : '添加成长照片' }}
+ 记录日期{{ recordDate }} ›
+ {{ field.label }}({{ field.unit }})柔韧度统一记录坐位体前屈,未触及脚尖可填写负值。
+ 已关联本次完成课程{{ noteContent.length }} / 1000分享给学员{{ shared ? '这份评语将出现在学员档案' : '仅馆主自己可见' }}
+ 仅支持图片,最大 10 MB。学员授权前,馆主不能从档案重新读取照片。
+ {{ saveError }}
+
+
+
+
+
+
+
diff --git a/packages/app/src/components/ProfileMenu.vue b/packages/app/src/components/ProfileMenu.vue
index 58c01ff..30e93b2 100644
--- a/packages/app/src/components/ProfileMenu.vue
+++ b/packages/app/src/components/ProfileMenu.vue
@@ -40,6 +40,7 @@ const emit = defineEmits<{
const menuItems = computed