131 Commits
Author SHA1 Message Date
jackyu66gitandCursor 7155b8b53a feat(api): 接入微信登录并原生实现咨询域(ECR-049/050)
小程序可在 Go 上完成微信手机号登录、测评、预约和下单,不再反代 Java。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 00:26:29 +08:00
jackyu66gitandCursor db4d118f9a fix(h5): 小程序 nh=1 模式保留子页返回按钮
原生顶栏隐藏 logo 顶栏时,非首页/我的仍显示 BackButton。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 04:43:07 +08:00
jackyu66gitandCursor fc53be22f8 fix(h5): 统一 nh=1 与 sbh 顶距逻辑,与 index.html 首屏一致
applyMpEmbedDom 在原生顶栏模式读取 session sbh;补充 nh+sbh 单测。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 04:21:52 +08:00
jackyu66gitandCursor e7290ed726 fix(h5): 首屏清 title + 桃色顶区对齐小程序 nav-bar(nh=1)
index.html 在 Vue 前清 document.title 并预应用 mp-native-header;
CSS 桃色顶区、隐藏 AppHeader,减轻黑字与渐变冲顶。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 04:09:12 +08:00
jackyu66git db3669c595 Revert "fix(h5): 小程序 nh=1 原生顶栏模式与 sbh 顶距(配 202608278)"
This reverts commit 580ba85b61.
2026-08-25 03:29:37 +08:00
jackyu66gitandCursor 580ba85b61 fix(h5): 小程序 nh=1 原生顶栏模式与 sbh 顶距(配 202608278)
H5 在 nh=1 时隐藏 AppHeader,支持 sbh 控制内容顶距,首屏 inline 预应用。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 03:24:42 +08:00
jackyu66gitandCursor 57687de360 feat(h5): 小程序原生顶栏 + 本地联调与一键部署
nh=1 隐藏 H5 顶栏并由 cover 承载 logo;H5 仅 4px 顶距避免重复留白。新增 dev:mp、deploy:h5 与联调文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 01:38:32 +08:00
jackyu66gitandCursor f4bd57ce1b fix(h5): 修复 WebView 顶栏 logo 与内容重叠
embed 模式 header 改文档流、移除负 margin;持久化 sbh 并在路由中保留,避免胶囊区与档案条重叠。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 01:22:39 +08:00
jackyu66git 9d4fb52d29 fix(h5): 小程序 WebView 通过 sbh 参数铺满刘海区
WebView 内 safe-area-inset-top 常为 0,改由小程序传入 statusBarHeight;
全屏洗底层上延并同步原生页背景色,修复刘海露白。
2026-08-25 01:18:16 +08:00
jackyu66gitandCursor 96292d0e95 fix(h5): 小程序 WebView 刘海区背景与顶栏安全区
Logo 下移 safe-area、embed 隐藏 HTML 标题;暖色渐变铺满刘海,页面背景上延与全屏洗底层对齐。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 01:14:07 +08:00
jackyu66gitandCursor 635a83fe11 fix(h5): 修复小程序 WebView 内 logo 与备案号展示
Logo 改用 BASE_URL 路径并在 embed 模式始终显示顶部栏;备案号改为页面底部文档流,避免悬浮遮挡内容。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 01:04:18 +08:00
jackyu66gitandCursor ebc2d3ad80 docs: 补充 Ubuntu+MySQL 并存与 PostgreSQL 部署指南
DEPLOY-MINI-PROGRAM-H5 增加 PG 安装三种方式、Go API systemd、Checklist 与双库架构说明。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 00:46:58 +08:00
jackyu66gitandCursor 8d856fb56c feat(h5): 小程序 embed 模式与全站 ICP 备案页脚
H5 支持 ?mp=1 嵌入微信 WebView;user-h5/admin-h5 底部展示蜀ICP备2025140386号-2 并链至工信部;补充小程序+H5 部署说明。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 00:41:14 +08:00
jackyu66gitandCursor d33a25a663 docs(BD-2026-044): rhythm-config-write 标记 Implemented · Closed
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-24 22:49:28 +08:00
jackyu66gitandCursor c693ac4bbc docs(ECR-048): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 22:51:42 +08:00
jackyu66gitandCursor e0f605558b feat(ECR-048): ReportTemplate 写面闭环并 Closed
growth.write POST/PUT · migration 000057 · 无新 C 端 · Loop STOP

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 22:51:42 +08:00
jackyu66gitandCursor aa197b719b docs(ECR-047): Freeze/Review 收口 → FROZEN WAIT
单刀授权硬边界 · 禁自动 ECR-048 · origin 齐平后冻结

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 22:32:25 +08:00
jackyu66gitandCursor 580f5ea3f0 docs(ECR-047): Human authorize Closed(不含 push)
Unauthorized Scope 经 authorize ECR-047 Closed 纳入正式 Closed;Loop STOP

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 22:21:54 +08:00
jackyu66gitandCursor 69cb99600f docs(ECR-047): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 22:14:21 +08:00
jackyu66gitandCursor 1db5fcc018 feat(ECR-047): FunnelDefinition 写面闭环并 Closed
growth.write POST/PUT · migration 000056 · 无新 C 端 · Loop STOP

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 22:14:21 +08:00
jackyu66gitandCursor 258deb0184 docs(ECR-046): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 21:56:11 +08:00
jackyu66gitandCursor b3fe4363fd feat(ECR-046): ScaleDefinition 元数据写面闭环并 Closed
explore.write POST/PUT · create→draft · status 仍 ECR-008 · migration 000055 · Loop STOP

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 21:56:11 +08:00
jackyu66gitandCursor fa8b0ba963 docs(ECR-045): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 21:29:43 +08:00
jackyu66gitandCursor 0158036341 feat(ECR-045): ImageCardDeck 写面闭环并 Closed
复用 admin.explore.write、POST/PUT+审计、C端 GET /cards/decks、
H5 无 active 空态/失败回退;migration 000054。无牌面内容编辑。
ExploreConfig Loop STOP,禁自动 ECR-046。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 21:29:43 +08:00
jackyu66gitandCursor dc93999f9e docs(ECR-044): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:43:08 +08:00
jackyu66gitandCursor 87b463b2bb feat(ECR-044): RhythmConfig 写面闭环并 Closed
复用 admin.explore.write、POST/PUT+审计、C端 GET /rhythm/configs、
H5 无 active 空态/失败回退;migration 000053。ExploreConfig Loop STOP,禁自动 ECR-045。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:43:08 +08:00
jackyu66gitandCursor fcc7667ba3 docs(ECR-044): Candidate Review 批准 RhythmConfig
首刀定为 RhythmConfig;Spec/Loop/Coding 未开;Auth 草案 PENDING;
排除 Prompt/Knowledge/Chunk,不预设 SystemPrompt。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:37:35 +08:00
jackyu66gitandCursor 19091bff12 docs(ECR-043): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:24:50 +08:00
jackyu66gitandCursor 77907f79ee feat(ECR-043): StarConfig 写面闭环并 Closed
加法权限 admin.explore.write、POST/PUT+审计、C端 GET /star/configs、
H5 无 active 空态/失败回退;migration 000052。ExploreConfig Loop STOP,禁自动 ECR-044。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:23:38 +08:00
jackyu66gitandCursor 2b295472a4 docs: feature-spec 索引补 ops-star-config-write
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:08:17 +08:00
jackyu66gitandCursor f492088237 docs(ECR-043): StarConfig 写面 Spec Ready(先不写码)
Human 批准 ExploreConfig Loop 仅限 043;Closed 后 STOP 禁自动 044;边界排除 Rhythm/Card/Scale/Prompt。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:07:58 +08:00
jackyu66gitandCursor cd3ac2c9ab docs: 恢复 TRACEABILITY 中 ECR-041/042 Closed 行
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:04:47 +08:00
jackyu66gitandCursor ec20e9744e docs(ECR-043): ExploreConfig 写面候选评审;收窄 Continuous Loop
CMS 041–042 锁定 Closed;下一刀不进 SystemPrompt;推荐首刀 StarConfig;禁止直接写码。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:04:36 +08:00
jackyu66gitandCursor aff6621ff8 docs(ECR-042): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:02:01 +08:00
jackyu66gitandCursor 56f661748a feat(ECR-042): OpsCMS FeedSlot 薄写面
Admin POST/PUT 复用 admin.cms.write;C 端 GET /home/feed-slots;首页无 active 槽隐藏推荐区、失败回退展示;无新 migration。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 20:02:01 +08:00
jackyu66gitandCursor 655141980a docs(ECR-041): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 19:55:27 +08:00
jackyu66gitandCursor 9707b72808 feat(ECR-041): OpsCMS Banner 薄写面(Write-Wave 首刀)
Admin POST/PUT + admin.cms.write/审计;C 端 GET /home/banners;首页投影回退静态 homeFeeds;migration 000051;不碰 FeedSlot/支付/UGC。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 19:55:27 +08:00
jackyu66gitandCursor ad45d17dff chore(repo): 仓侧治理门禁 — ECR/migration 身份唯一
将编号与 schema 完整性留在 Repository Governance,不扩 ESS/Loop;TRACEABILITY 锚定 Next ECR=041、Max Migration=000050。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 14:26:30 +08:00
jackyu66gitandCursor d81e8364cc fix(h5): 星座分享卡置顶;首页头像进个人档案
星座 ShareSheet/落地页卡片改到上方;首页顶栏个人入口从愈心解码改为 /profile。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 02:34:58 +08:00
jackyu66gitandCursor b7b0b18802 fix(db): 重编号合并后撞号 migration,并修 admin e2e base
将 015–023 双文件冲突线性化为 015–050;提供已有库 schema_migrations 修复脚本;admin Playwright 对齐 /psy/admin/ 预览路径。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 02:14:52 +08:00
jackyu66gitandCursor 0d50c0ee73 fix(admin): 收紧 isSuper、plan-prices RBAC 与封禁状态机
避免 roles.write 绕过全部 can();定价读写挂 membership.plans 权限;去掉快捷封禁双路径并让 ban/unban 走 lifecycle。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 01:56:00 +08:00
jackyu66gitandCursor 62cd8c45dd chore: 合入 stash Ops hardening 与 migration 000041
Ask/catalog 权限与审计加固、量表读权限统一,以及未提交的 ops hardening 变更。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 01:46:34 +08:00
jackyu66gitandCursor 4889ff5916 merge: 合入本地 Ops 扩展与 origin/main(ECR-009–016)
保留远程用户侧 ECR-009–016 与本地 Ops 目录/RBAC/CMS/危机等能力;文档标注分叉期间 ECR 编号冲突。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 01:45:53 +08:00
jackyu66gitandCursor 89756f65b4 feat(ECR-012–016): 合规、题库、时辰刷新、头像、MBTI OEJTS 与埋点
落地输入合规、探索题库、报告日/时辰刷新、账号头像、OEJTS 量表,并补齐 H5 埋点与 Admin 漏斗;同步 ESS 工件、切至自建 Git、清理 GitHub Actions。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 01:27:58 +08:00
jackyu66gitandCursor 13860bf1ef feat(ECR-011): 昵称、首页贴士与档案 Self 唯一/合盘交叉校验
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
每账号仅一条 self(migration 40902);合盘只选 TA;账号昵称可改;首页穿衣/颜色/养生贴士。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 22:05:00 +08:00
jackyu66gitandCursor 5ceb3ce749 feat(ECR-010): Ops-E 系统运营;修复登出解绑;P2 Complete
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
落地管理员 RBAC/封禁/推送任务 stub,logout 解绑 device 并统一各页 ensureAccount,同时收口 P2 生日生成与状态文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-11 18:54:59 +08:00
jackyu66gitandCursor 1026cd0596 docs(ECR-040): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 03:20:42 +08:00
jackyu66gitandCursor e9c11cdf1d feat(ECR-040): ExploreConfig ScaleDefinition 只读投影并 Closed
复用 scales 表只读投影;admin-h5 /catalogs 聚合 026–040 目录;Loop 队列 STOP。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 03:20:42 +08:00
jackyu66git 432c090046 docs(ECR-039): TEST_REPORT 补 commit sha 2026-08-08 03:17:12 +08:00
jackyu66git e955f1e6a2 feat(ECR-039): GrowthInsights FunnelDefinition 只读并 Closed
FunnelDefinition catalog (000040) · Loop continuous.
2026-08-08 03:17:12 +08:00
jackyu66git 63742c1d66 docs(ECR-038): TEST_REPORT 补 commit sha 2026-08-08 03:16:57 +08:00
jackyu66git 5de9a7bbe5 feat(ECR-038): GrowthInsights ReportTemplate 只读并 Closed
ReportTemplate catalog (000039) · Loop continuous.
2026-08-08 03:16:57 +08:00
jackyu66git b34b4f281f docs(ECR-037): TEST_REPORT 补 commit sha 2026-08-08 03:16:42 +08:00
jackyu66git 5c462ecb2a feat(ECR-037): ExploreConfig ImageCardDeck 只读并 Closed
ImageCardDeck catalog (000038) · Loop continuous.
2026-08-08 03:16:42 +08:00
jackyu66git 0fa6da2446 docs(ECR-036): TEST_REPORT 补 commit sha 2026-08-08 03:16:26 +08:00
jackyu66git bd9e13497f feat(ECR-036): ExploreConfig RhythmConfig 只读并 Closed
RhythmConfig catalog (000037) · Loop continuous.
2026-08-08 03:16:26 +08:00
jackyu66git 57acfa6105 docs(ECR-035): TEST_REPORT 补 commit sha 2026-08-08 03:16:12 +08:00
jackyu66git ebc93b6c7e feat(ECR-035): ExploreConfig StarConfig 只读并 Closed
StarConfig catalog (000036) · Loop continuous.
2026-08-08 03:16:12 +08:00
jackyu66git 09b9c4daab docs(ECR-034): TEST_REPORT 补 commit sha 2026-08-08 03:15:59 +08:00
jackyu66git 45e98f6872 feat(ECR-034): AdminGovernance PrivacyRequest 只读并 Closed
PrivacyRequest catalog (000035) · Loop continuous.
2026-08-08 03:15:59 +08:00
jackyu66git aad6cdf7ea docs(ECR-033): TEST_REPORT 补 commit sha 2026-08-08 03:15:45 +08:00
jackyu66git 487bee78d1 feat(ECR-033): AskOperations HandoffCase 只读并 Closed
HandoffCase catalog (000034) · Loop continuous.
2026-08-08 03:15:45 +08:00
jackyu66git 01063208a1 docs(ECR-032): TEST_REPORT 补 commit sha 2026-08-08 03:15:30 +08:00
jackyu66git 447fb6da16 feat(ECR-032): CrisisCare InterventionOutcome 只读并 Closed
InterventionOutcome catalog (000033) · Loop continuous.
2026-08-08 03:15:30 +08:00
jackyu66git 58eef7c02b docs(ECR-031): TEST_REPORT 补 commit sha 2026-08-08 03:15:16 +08:00
jackyu66git 24a115297b feat(ECR-031): CrisisCare CrisisEvent 只读并 Closed
CrisisEvent catalog (000032) · Loop continuous.
2026-08-08 03:15:16 +08:00
jackyu66git 0d4bc5054e docs(ECR-030): TEST_REPORT 补 commit sha 2026-08-08 03:15:00 +08:00
jackyu66git b904e6b04f feat(ECR-030): ContentSafety ModerationCase 只读并 Closed
ModerationCase catalog (000031) · Loop continuous.
2026-08-08 03:15:00 +08:00
jackyu66git 271e312669 docs(ECR-029): TEST_REPORT 补 commit sha 2026-08-08 03:14:45 +08:00
jackyu66git 5846d39d97 feat(ECR-029): ContentSafety BlockPolicy 只读并 Closed
BlockPolicy catalog (000030) · Loop continuous.
2026-08-08 03:14:45 +08:00
jackyu66git e6740a0326 docs(ECR-028): TEST_REPORT 补 commit sha 2026-08-08 03:14:30 +08:00
jackyu66git 00d9ed5610 feat(ECR-028): AICoreConfig ToolDefinition 只读并 Closed
ToolDefinition catalog (000029) · Loop continuous.
2026-08-08 03:14:30 +08:00
jackyu66git 1f572c4151 docs(ECR-027): TEST_REPORT 补 commit sha 2026-08-08 03:14:17 +08:00
jackyu66git c1a8a58488 feat(ECR-027): AICoreConfig KnowledgeChunk 只读并 Closed
KnowledgeChunk catalog (000028) · Loop continuous.
2026-08-08 03:14:17 +08:00
jackyu66gitandCursor 78857d5510 docs(ECR-026): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 03:13:36 +08:00
jackyu66gitandCursor b91806ba80 feat(ECR-026): OpsCMS ScheduledPublication 只读并 Closed
定时发布目录(ops_scheduled_publications),并加固 catalog 生成器。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 03:13:36 +08:00
jackyu66gitandCursor 8c50b3d925 docs(ECR-025): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 03:08:40 +08:00
jackyu66gitandCursor e32466357d feat(ECR-025): OpsCMS FeedSlot 只读并 Closed
栏目位目录(ops_feed_slots + /cms),复用 admin.cms.read。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 03:08:40 +08:00
jackyu66gitandCursor f51b2524c5 docs(ECR-024): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 03:05:55 +08:00
jackyu66gitandCursor 32ac559385 feat(ECR-024): OpsCMS Banner 只读并 Closed
运营横幅目录(ops_banners + admin /cms),锁定 024–040 全队列。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 03:05:55 +08:00
jackyu66gitandCursor ac1aec857d docs(ECR-023): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 01:49:58 +08:00
jackyu66gitandCursor bf1ae8bc53 feat(ECR-023): AICoreConfig KnowledgeSource 只读并 Closed
运营可观测知识源目录(knowledge_sources + admin /ai),不含 Chunk/Embedding。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 01:49:58 +08:00
jackyu66gitandCursor dd4d644eaa docs(ECR-022): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 01:28:45 +08:00
jackyu66gitandCursor de224184a6 feat(ECR-022): CrisisCare CrisisPolicy 只读并 Closed
新增 crisis_policies、admin.crisis.read、列表/试匹配 API 与 admin-h5「危机」页;禁 CrisisEvent 写/UGC/真支付。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 01:28:45 +08:00
jackyu66gitandCursor 4b5e5bc63d docs(ECR-021): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 00:27:17 +08:00
jackyu66gitandCursor 140b08ca01 feat(ECR-021): AICoreConfig SystemPrompt 只读并 Closed
新增 system_prompts 目录、admin.ai_config.read 与 admin-h5「AI」页;本切片不改运行时 Prompt、禁写发布/UGC/真支付。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 00:27:17 +08:00
jackyu66gitandCursor 22f9e358ae docs(ECR-020): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 23:02:13 +08:00
jackyu66gitandCursor 93227d3316 feat(ECR-020): QualityFeedback 问答质量反馈并 Closed
新增 ask_quality_feedback、运营/C端评分 API 与 admin-h5 问答反馈区;禁改消息/UGC/真支付。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 23:02:13 +08:00
jackyu66gitandCursor e270a38393 docs(ECR-019): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 22:13:23 +08:00
jackyu66gitandCursor cae3380cbf feat(ECR-019): ContentSafety FilterRule 只读并 Closed
新增 filter_rules、admin.content_safety.read、列表/详情/试匹配 API 与 admin-h5「安全」页;禁审核写/UGC/真支付。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 22:13:22 +08:00
jackyu66gitandCursor de025d72bc docs(ECR-018): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 19:26:16 +08:00
jackyu66gitandCursor c81f57a7d1 feat(ECR-018): Entitlement 用户权益只读并 Closed
聚合 GET /admin/users/:id/entitlements(Membership∪DeepAccess∪问答额度)与 admin-h5 权益 Tab;无 migration / 无真支付。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 19:26:15 +08:00
jackyu66gitandCursor 37b91e51b8 docs(ECR-017): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 18:39:38 +08:00
jackyu66gitandCursor 00a798bd85 feat(ECR-017): AskOperations 问答会话只读并 Closed
新增 admin.ask.read、GET /admin/ask/threads*(AskSessionView)与 admin-h5「问答」页;禁改消息/UGC/真支付。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 18:39:37 +08:00
jackyu66gitandCursor 1c157a0e46 docs(ECR-016): TEST_REPORT 补 commit sha
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 18:31:40 +08:00
jackyu66gitandCursor 61ae3b0451 feat(ECR-016): UserIntelligence 用户洞察只读切片并 Closed
聚合 GET /admin/users/:id/insight(报告类型/派生标签/行为快照),admin-h5 洞察 Tab;无 migration / 无 UGC / 无真支付。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 18:31:06 +08:00
jackyu66gitandCursor 1afda1d389 docs: 队列指向 ECR-016 UserIntelligence
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 18:17:06 +08:00
jackyu66gitandCursor 1eeb0b00e7 feat(ECR-015): RedemptionCode 兑换码并 Closed
批次生成/作废、C 端兑码延长会员;admin-h5 /codes。
Loop continuous。Next:ECR-016 UserIntelligence。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 18:16:13 +08:00
jackyu66gitandCursor 0e26aabef8 docs: 同步 ECR-014 Closed 与 Loop 队列指向 ECR-015
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 18:04:43 +08:00
jackyu66gitandCursor 882c01d81a feat(ECR-014): MembershipPlan 套餐配置并 Closed
membership_plans 表、admin 套餐页、Grant/CreateOrder 读表;
Loop continuous 自动 Approve/Closed。Next:ECR-015 RedemptionCode。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 18:03:38 +08:00
jackyu66gitandCursor e25cd94b0c feat(ECR-013B): AccountLifecycle Closed;启用 Loop 连续执行
UserStatus 迁移、DeviceAuth 拒绝非 active、admin-h5 CTA;
Reviewer Closed。Human 授权 LOOP_AUTHORIZATION(免逐闸确认)。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 17:47:18 +08:00
jackyu66gitandCursor f75b42397f docs(ECR-013B): 启动 AccountLifecycle 契约定义
Human Start Authorization:UserStatus 状态机 Spec/BD/contract_diff;
禁止 coding,待 Approve + coding Start Authorization。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 17:23:04 +08:00
jackyu66gitandCursor b5a05941d9 feat(ECR-013A): Admin RBAC 实现并 Closed
角色权限、RequirePermission、/me permissions 与 migration 000015;
Reviewer Approve → Closed。Next:ECR-013B Contract Definition。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 17:19:45 +08:00
jackyu66gitandCursor 85ed0901bb docs: record WAVE0 Human Review FREEZE
Human Decision=FREEZE on foundation 27f27a1; next gate ECR-013A contract only after Start Authorization.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 16:31:42 +08:00
jackyu66gitandCursor 27f27a1cb2 docs: freeze WAVE0 domain foundation and contract governance
Mark WAVE0 FROZEN CANDIDATE for Human Review; docs + .ai domain/product only — no apps or migrations.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 16:20:11 +08:00
jackyu66gitandCursor d33c8fdfe9 feat(ECR-012): 星座对齐收口,并 Closed ECR-007/008
对齐 outlook/分享 type=star/报告页运势面板与测试;流程上关闭 Ops-B/C 两张 ECR。真支付仍后置。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 15:48:19 +08:00
jackyu66gitandCursor 0ee4d4f5ae docs(loop): approve and close LOOP-RUN-002 Ops-D sample
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:47:39 +08:00
jackyu66gitandCursor 31a0ec721a docs(ECR-009): dedupe TRACEABILITY
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:46:22 +08:00
jackyu66gitandCursor e58a24ddd2 docs(loop): LOOP-RUN-002 ready for human approval
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
Ops-D sample at READY_FOR_APPROVAL with Gate PASS and sample notes
on reduced human steps (no Plan Mode confirm).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:45:51 +08:00
jackyu66gitandCursor d48e95d42c docs(ECR-009): record commit evidence and BD Status Approved
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:45:32 +08:00
jackyu66gitandCursor ca3b13554c feat(ECR-009): Ops-D order filters, plan display prices, refund status
LOOP-RUN-002 sample: admin order multi-filter, membership display
price catalog, read-only refund_status. No real payment or RBAC.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:45:32 +08:00
jackyu66gitandCursor 7ab9add5dd feat(ops): ECR-007 行为分析与 ECR-008 内容运营后台
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
落地埋点 ingest/数据看板、首页宫格 CMS 与测评上下架;含账号引导、问答流式与免责声明去重,以及 review P1 审计同事务修复。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:26:16 +08:00
jackyu66gitandCursor 7e9023f0a8 test(e2e): 前后台联调 Playwright 与 admin 冒烟
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
新增 e2e-live 真 API 一致性全路径,并为 admin-h5 增加 mock 浏览器冒烟。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 22:41:43 +08:00
jackyu66gitandCursor 879bf70cb7 feat(ECR-006): 落地运营后台 Phase A(admin API + admin-h5)
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
新增独立鉴权的 /api/v1/admin 与 Vue 控制台;会员授予与审计同事务,并补集成/单测。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 18:35:53 +08:00
jackyu66gitandCursor 4a583c9480 style(h5): HomeToolIcon 全局放大约 39%
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
统一按 prop×1.392 显示,并同步首页九宫格容器,避免裁切。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 16:10:39 +08:00
jackyu66gitandCursor 00fc7f82b9 refactor(ECR-005): 再拆 Ask/Decode/Portrait 与 composable,补强 OpenAPI
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
压低贴线 SFC/composable;报告/档案/量表/意象卡 path 挂 Envelope $ref;CI ESS 门禁跟到 ECR-005。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 22:38:32 +08:00
jackyu66gitandCursor 7034c92de7 refactor(ECR-004): Synastry 再拆、Scale 测、Membership 守卫、OpenAPI 与 CI
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
压合盘贴线文件;补选答单测与 nil 守卫;对齐关键 OpenAPI schemas;加 GitHub Actions 门禁。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 21:06:14 +08:00
jackyu66gitandCursor 67701d1f7b chore(ECR-001,ECR-003): 关闭结构对齐并清理 outlook JSON 旧键
正式关闭 ECR-001/002;删除 fortune 双写与 lucky 字段,H5 改读 outlook/boost。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 20:39:34 +08:00
jackyu66gitandCursor 69fa1b85d6 fix(ECR-001): 对齐 Playwright e2e 与 /psy/ base 及现 UI
E2E 改走 /psy 路径并更新过时文案断言,恢复 L3 冒烟;补充 Phase F QA 报告。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 18:34:11 +08:00
jackyu66gitandCursor e735aa43e3 refactor(ECR-001): Phase F types/sdk 对齐并拆分超标 H5 页
抽出 OpenAPI DTO;将 Ask/Report/Profile/Star 等 8 页拆到 ≤400 行,并修 ScaleSummary、fortuneKey、Scale 选答与单测。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 18:19:34 +08:00
jackyu66gitandCursor 19d3cd5945 refactor(ECR-001): 接入 ESS 并完成结构对齐 Phase A–E
绑定 ESS 双轨治理,拆分超大 H5 页与 Go 引擎,抽出 membership 服务,
并将 star/fortune 重命名为 outlook(JSON 双写兼容);同时修复 /psy API 代理与首页 + 菜单层级。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 17:51:40 +08:00
jackyu66git 583133dd09 fix: baseURL 改为 /psy 避免 SDK joinURL 双重 /api 2026-08-05 16:36:47 +08:00
jackyu66git 9f65c11bad fix: API baseURL 改为 /psy/api + gitignore Go 二进制 2026-08-05 16:24:40 +08:00
jackyu66git b46d651892 切换为 Vue SPA 首页,删除旧版静态页面
- server.py: 支持 Vue SPA fallback,根路径优先 VUE_DIST
- router: createWebHistory('/psy/')
- 删除旧版 pages/css/js 目录和根目录 HTML 文件
2026-08-05 15:05:19 +08:00
jackyu66gitandCursor e589af9bc0 feat: 首页档案条改为自己/添加/列表三分区,对齐测测交互
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 15:01:11 +08:00
jackyu66gitandCursor 53eb4577b3 feat: 按测测功能重构 H5 首页与各子页,并修正顶栏「+」添加档案菜单
对齐测测交互:首页「+」支持邀请填档案/添加档案/邀请合盘;各 Tab 与工具页按同一视觉与功能标准落地;本地对照截图目录显式忽略。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 14:32:35 +08:00
jackyu66gitandCursor bd22d9dddd feat: P1 合盘/星座/问答与测测完整设计包及模拟器取证工具
落地 synastry/star/ask API 与 H5 页面,补齐 cece-frontend-re complete-design 证据文档,并加入 Android 模拟器截图抓取脚本。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-03 11:37:53 +08:00
jackyu66gitandCursor 15a9db374a feat: add exploration scale list, questions, and scoring
Seed communication-style scale, expose /api/v1/scales APIs, and wire
Explore/Scale H5 pages for the P1 探索测试 path.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-02 16:29:31 +08:00
jackyu66gitandCursor 14b836f53b feat: add RelationInsight API and wire H5 relation/profile pages
Second P1 growth engine: compare two profiles, gate full tips behind
deep-access mock payment, and list personal archives on /profile.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-02 16:28:10 +08:00
jackyu66gitandCursor 0f320e040b feat: P1 profile/portrait API and freeze local-dev environment
Add host-first environment contracts (Local vs CI vs Prod), deps-only
compose, and the Profile → Portrait → deep-access mock payment slice
with device identity and auto-migrate on API startup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-02 16:24:57 +08:00
jackyu66gitandCursor dd94e57277 docs: freeze YuXinGu lexicon, journey, and P1 engineering sources
Establish product language contract, user journey with dual growth engines,
ERD/OpenAPI/Go boundaries, and H5 routes (/profile, /portrait, /relation,
/membership) before P1 implementation.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-02 16:12:10 +08:00
1515 changed files with 100072 additions and 6612 deletions
+7 -5
View File
@@ -27,6 +27,8 @@ Also always: `ai-contract.md`, `forbidden.md`, `file-map.md`, `workflow.md`, `co
├── domain/
│ └── domain-map.md # DDD contexts / aggregates
├── product/
│ ├── feature-design.md # Feature Spec 强制规范
│ ├── feature-spec/ # 单功能详细设计
│ ├── feature-map.md # 愈心谷 Feature Tree
│ └── cece-feature-map.md
├── file-map.md
@@ -36,11 +38,11 @@ Also always: `ai-contract.md`, `forbidden.md`, `file-map.md`, `workflow.md`, `co
├── api.md
├── database.md
├── ui.md # IA pointer → design/
├── design/ # AI Design System Contract
│ ├── design-system.md
│ ├── component-catalog.md
│ └── platform/
├── deployment.md
├── design/ # AI Design System + reverse-engineering-spec.md
├── environment.md # Local / CI / Prod 分离
├── development.md # 本地本机开发
├── docker.md # Docker 用途边界
├── deployment.md # 生产 / CI 部署
├── testing.md
├── security.md
├── review.md
+9 -2
View File
@@ -5,12 +5,19 @@ Do **not** build everything at once. Rules have maintenance cost.
## Phase 1 — Now (shipped)
- Rules: constitution, architecture, domain, coding, api, database, ui, …
- **Environment layer (FROZEN):** `environment.md` · `development.md` · `docker.md` · `deployment.md` · `commands.md`
- ADR, patterns, examples, playbooks
- Review / DoD / checklists / forbidden / commands / workflow / file-map
- Review / DoD / checklists / forbidden / workflow / file-map
- `ai-contract.md`
- Cursor runtime: `.cursor/*` → symlink → `.ai/` (no content copy)
**Invest next engineering time in:** polishing `patterns/`, `examples/`, `playbooks/` while building real features — not more rule files.
**Invest next time in product implementation, not more meta-rules:**
```
产品冻结 → Domain → ERD → OpenAPI → 页面路由 → P1 编码
```
Do **not** expand the engineering-spec layer unless a repeated AI failure demands it.
## Phase 2 — When the codebase grows
+32
View File
@@ -0,0 +1,32 @@
# ADR-0007 — ESS 与 `.ai/` 双轨治理
- Status: Accepted
- Date: 2026-08-05
- Tags: process, ess, agents
## Context
仓库已有成熟的 `.ai/` AI Engineering System(领域、Feature Spec、DoD、架构冻结)。
2026-08-05 绑定 **engineering-spec-system v1.0**,引入 `docs/ECR|TASKS|HANDOFF|STATE` 与角色门禁。
若两套文档并行且无优先级,Agent 会冲突或重复发明规则。
## Decision
1. **产品 / 领域 / Lexicon / Feature Spec / DoD / 架构冻结 / 安全编码**:以 **`.ai/`** 为唯一权威。
2. **变更分级 / 角色(Architect·Engineer·Reviewer·Release/ ECR·Task·Handoff·validate**:以 **ESS + 根目录 `docs/`** 为权威。
3. **L2+ 行为或结构重构**:必须同时满足
- Active Feature Spec(若涉及产品行为;纯结构重构可用 PRODUCT_SPEC「行为冻结」)
- Approved ECR under `docs/ECR/`
4. **L3 栈或包边界**:另需 `.ai/adr/` AcceptedESS ENGINEERING_SPEC 引用该 ADR。
5. **禁止**将 ESS 整树复制进本仓;仅保留 Profile / wrappers / 过程工件。
## Consequences
- Agent 会话:先 `docs/PROJECT_PROFILE.md`,再按 `AGENTS.md` 加载 `.ai/`
- 冲突时:用户可见语义与完成标准听 `.ai/`;能否开工听 ECR/Role。
- 后续重构按 ECR-001 分 Phase,禁止无合同大爆炸重写。
## Alternatives considered
- 用 ESS 替换 `.ai/`:丢弃已验证的 lexicon/DoD/feature-spec,成本高,否决。
- 只用 `.ai/` 忽略 ESS:无法满足「用 ESS 治理重构」诉求,否决。
+29
View File
@@ -0,0 +1,29 @@
# ADR-0008 — Go 为唯一用户后台,咨询域过渡反代
- Status: Accepted
- Date: 2026-09-14
- Tags: identity, miniprogram, consult, gateway
## Context
愈心谷 C 端同时打两套后台:咨询/测评在 Java + MySQL,愈心魔方在 Go + PostgreSQL。
`wx.login``code` 只能用一次,无法先后换两套 token。小程序需要单一身份与单一请求入口。
## Decision
1. **Go + PostgreSQL 是唯一用户身份源。** 微信 openid / 手机号写在 `users`
2. **Java 过渡期为被调方**Go 用 openid/phone 调内网 `issue-mini-app` 换 Java Redis token,并反代 `/app-api``/admin-api`
3. **咨询业务表本 ADR 不迁**;支付与档期另开 ECR。
4. **Admin 登录独立**,不走本决策。
## Consequences
- 小程序只配置 Go 域名(现网经 `/psy/api/` 反代)。
- 下线 Java 必须另开 ECR,并先迁支付。
- 历史魔方账密用户按手机号合并到 `wx_openid`
## Alternatives considered
- 只做 SSO、双库长期并存:否决(用户要求合库合服务)。
- 以 Java 吸收魔方:否决(栈已锁定 Go + PG)。
- 客户端双 token:否决(code 单次使用,且拖住前端统一接入)。
+12 -6
View File
@@ -9,27 +9,33 @@ MUST read:
1. `.ai/constitution.md`
2. `.ai/architecture.md`
3. `.ai/domain.md` (+ `domain/domain-map.md` when touching models/API)
4. `.ai/coding.md`
5. Task-relevant: `api.md` / `database.md` / `ui.md` / `security.md` / `product/feature-map.md`
6. UI tasks: `design/design-system.md` + `design/component-catalog.md` + `design/platform/*`
7. Relevant ADR under `.ai/adr/` if changing stack or style
4. `.ai/definition-of-done.md`(完成标准;开始前知道何谓 Done
5. `.ai/coding.md`
6. Task-relevant: `api.md` / `database.md` / `ui.md` / `security.md` / `testing.md` / `product/lexicon.md` + `product/feature-map.md` + **`product/feature-design.md`** + **`product/feature-spec/<id>.md`**(该功能 Spec;§4 User Flow、§7 Rules、§9 API、§12 Acceptance 必须非空)
7. Run/dev tasks: `environment.md` + `development.md`(部署/镜像任务才读 `deployment.md` / `docker.md`
8. UI tasks: `design/design-system.md` + `design/component-catalog.md` + `design/platform/*`
9. Competitor / reverse-engineering tasks: `design/reverse-engineering-spec.md`STEP 118 · Evidence First;禁止 Demo 式省略)
10. Relevant ADR under `.ai/adr/` if changing stack or style
## After coding
MUST:
1. Run / follow `.ai/review.md` and print Review block
2. Verify `.ai/definition-of-done.md`
1. Verify `.ai/definition-of-done.md`**Done ≠ Code Complete**
2. Run / follow `.ai/review.md` and print **Review Report**DoD §7
3. Use matching checklist under `.ai/checklists/`
4. Prefer verifying with `.ai/commands.md` (build/test/health)
5. If P1 scope: update or respect labels in `product/p1-status.md`(当前为 **P1 Complete**;扩行为须新 Spec
## Never
- Guess API shape
- Guess DB schema
- Guess product requirement
- Code new/changed feature behavior without Feature Spec`product/feature-design.md`
- Invent endpoints, tables, or domain words not in `.ai/domain.md` / OpenAPI / task
- Silently reverse an Accepted ADR
- Default local workflow to full-stack Docker / rebuild app images on every code change
## If unclear
+8 -3
View File
@@ -1,16 +1,21 @@
# Architecture
Go 包边界(冻结):[architecture/go-services.md](architecture/go-services.md)
Domain / ERD[domain/domain-map.md](domain/domain-map.md) · [domain/erd.md](domain/erd.md)
## Allowed call graph
```
UI (user-h5 / mini-program)
→ packages/sdk
UI (user-h5 / mini-program / admin-h5)
→ packages/sdk(或 admin 薄 api 客户端)
→ API Handler
→ Service
→ Repository
→ Database
```
Admin 路由挂 `/api/v1/admin/*`,鉴权与终端 `DeviceAuth` **隔离**(见 `feature-spec/ops-admin.md`)。
## Forbidden
- Handler → Database (skip Service/Repository)
@@ -27,7 +32,7 @@ UI (user-h5 / mini-program)
| `apps/api` | Only backend |
| `apps/user-h5` | Primary client (Vue3+TS) |
| `apps/mini-program` | Scaffold only until tasked |
| `apps/admin-h5` | Deferred |
| `apps/admin-h5` | Ops Phase AECR-006 |
| `packages/sdk` | Multi-platform HTTP client |
| `packages/types` | Shared TS types |
| `packages/utils` | Pure helpers |
+51
View File
@@ -0,0 +1,51 @@
# Go 服务边界(冻结)
单二进制 `apps/api`;按包拆分,**禁止**跨层:Handler → Service → Repository。
详见 [../architecture.md](../architecture.md)。
---
## Packages under `internal/service/`
| Package | 职责 | P1 | 实现态(2026-08 |
|---|---|---|---|
| `user` | 注册/游客升级/Session | Yes | 多在 profile/auth 路径;无独立包名时勿重复造轮 |
| `profile` | 个人档案 CRUD、切换 | Yes | `service/profile` |
| `portrait` | 生成个人画像 → GrowthReport | Yes | 计算在 `internal/portrait`;用例经 report/handler 路径 |
| `scale` | 探索测试定义与计分 | Yes | `service/scale` + `internal/scale` |
| `relation` | RelationInsight | Yes **必做** | `service/relation` + `internal/relation` |
| `report` | GrowthReport 读取 + **权益裁剪** | Yes | `service/report` |
| `ask` | Thread/MessageP1 规则引擎 + 额度 | YesDemo | `service/ask` + `internal/ask` |
| `companion` | SolarTerm 读、Mood 写 | Shell | `service/companion` |
| `membership` | 成长会员状态与额度 | Yes | `service/membership`ECR-001 Phase C 已从 report 抽出) |
| `order` | Order + pay-mock + DeepAccess 发放 | Yes | 用例在 `service/membership`(同 Phase C;未单独拆包) |
| `imagecard` | 意象卡片 | P2 | `service/imagecard` |
| `admin` | 运营后台鉴权与运维用例 | Ops-A | `service/admin`ECR-006 |
### Engine vs Service
| Kind | Path | Can | Cannot |
|---|---|---|---|
| Engine | `internal/{portrait,relation,star,ask,scale,rhythm,…}` | 纯计算 / 组装报告结构 | 引用 `gin.Context`;做权益解锁 |
| Service | `internal/service/*` | 用例编排、鉴权后业务、调 repo/engine | SQL 直写;跳过归属校验 |
`internal/handler/`:每域一组 handler,只做 bind/validate/调用 service。
`internal/repository/`SQL;无 business unlock 规则(规则在 service/report + membership)。
星座周期展望引擎包:`internal/star/outlook`(原 `fortune`ECR-002)。对外 JSON 仅 `outlook` / `outlook_detail`;周期提示字段为 `boost`ECR-003 已移除 `fortune`/`lucky` 兼容键)。
---
## 跨域规则
- **权益判定**只在 `report` / `ask` / `membership` service,不在 handler、不在 H5。
- `portrait``relation``growth_reports`;读一律走 `report.Get`(带裁剪)。
- `ask` 强制校验 `profile` 归属当前 user。
---
## 禁止
- 新建 `decode` / `match` / `unlock` / `fortune` 包名
- Handler 直连 DB
- 在 JSON 字段名使用 `luck` / `fortune` / `ji_xiong`
+36 -14
View File
@@ -1,16 +1,38 @@
# Checklist: Feature
- [ ] Architecture layers respected
- [ ] Domain words match `.ai/domain.md`
- [ ] API (+ OpenAPI if public)
- [ ] Service
- [ ] Repository (if persistence)
- [ ] Migration (if schema)
- [ ] SDK/types (if client needs)
- [ ] UI (if user-facing)
- [ ] Test or smoke steps
- [ ] Docs touched if behavior user-visible
- [ ] `go test` / `npm run build:h5` as applicable
- [ ] Health still OK
- [ ] Review block printed
- [ ] DoD satisfied
对照 `.ai/definition-of-done.md` + `product/feature-design.md`。全部适用项勾选后才能称 Feature Complete
## Product / Spec
- [ ] `feature-spec/<id>.md` 存在且 Status=Active(或本次已更新)
- [ ] feature-map / journey / page-tree 覆盖
- [ ] Spec §4 User Flow 完整(含无数据/权益分支)
- [ ] Spec §7 Business Rules 含 Server 权益
- [ ] Spec §9 API 与 OpenAPI 一致
- [ ] Spec §12 Acceptance 已逐条验证
- [ ] Loading / Empty / Error / Normal+ Locked 若适用)
- [ ] lexicon 文案
## Backend
- [ ] OpenAPI
- [ ] Envelope errors(非裸 error
- [ ] handler → service → repository
- [ ] AuthZ / 权益服务端
- [ ] Migration if schema
- [ ] L1 unit for core logic
## Frontend
- [ ] 四态(+ Locked
- [ ] lexicon 文案
- [ ] SDK/types 若需要
## Verify
- [ ] L0: `go test ./...` / `npm run build:h5`
- [ ] L2 integration 或书面 smokeP1 关键流须自动化)
- [ ] Health OK
- [ ] Review Report 已输出
- [ ] Spec §14 Implementation Notes / Gaps 已更新
- [ ] Scope label 正确(Demo / Feature Complete / …)
+68 -36
View File
@@ -1,67 +1,99 @@
# Commands — Do Not Guess
Run from repo root unless noted.
Run from **repo root** unless noted.
Policy: [environment.md](environment.md) · [development.md](development.md)
## Go API (`apps/api`)
本仓库用 **npm workspaces**`npm run …`);等价于文档中的 pnpm 习惯用法。
---
## Local Development — First time
1. Install host toolchains: Go 1.22+ · Node 20+ · Docker Desktop(仅依赖服务)
2. `npm install`
3. `cp apps/api/config.example.yaml apps/api/config.local.yaml`(填 `database.*``deepseek.api_key`
4. `npm run deps:up`(或 `docker compose -f docker-compose.dev.yml up -d`
5. Start API once so migrations apply: `cd apps/api && go run ./cmd/server`
6. Verify: `curl -s http://127.0.0.1:8080/api/v1/healthz`
7. Start H5: `npm run dev:h5` → http://127.0.0.1:5173
8. (可选)埋点:`cp apps/user-h5/.env.example apps/user-h5/.env.local`,填 `VITE_GA_MEASUREMENT_ID`;调试可设 `VITE_ANALYTICS_DEBUG=1`(见 `feature-spec/analytics.md`
Optional CN Go proxy: `export GOPROXY=https://goproxy.cn,direct`
Optional API hot reload: install `air`, then `cd apps/api && air`(见 `.air.toml`
---
## Local Development — Daily
```bash
export GOPROXY=https://goproxy.cn,direct # if download timeout
# Terminal 1 — infrastructure only
npm run deps:up
# Terminal 2 — backend (host)
cd apps/api
air
# 或: go run ./cmd/server
# Terminal 3 — frontend (host)
npm run dev:h5
```
Stop deps: `npm run deps:down`
---
## Go API
```bash
cd apps/api
go mod tidy
go build ./...
go test ./...
# L2(需 deps:up):Portrait / Relation / Membership 三流
go test ./internal/integration/ -count=1
go build ./...
go run ./cmd/server
```
Health:
根目录快捷:`npm run test:api` · `npm run test:api:integration`L2 需先 `deps:up`
Env defaults / template: `deploy/.env.example`
Migrate: applied on API startup (`apps/api/migrations/*.up.sql`)
```bash
curl -s http://127.0.0.1:8080/api/v1/healthz
curl -s http://127.0.0.1:8080/api/v1/ping
```
**Do not** `docker build` the API for everyday coding.
---
## User H5
```bash
npm install
npm run dev:h5
npm run build:h5
npm run test:h5 # Vitest
npm run test:e2e # Playwright(先 build:h5;用系统 Chrome
```
## Docker / DB
**Do not** dockerize Vite for everyday coding.
---
## Admin H5Ops Phase A · ECR-006
```bash
docker compose -f deploy/docker-compose.yml up -d
docker compose -f deploy/docker-compose.yml down
# config.local.yaml 需 admin.bootstrap_*(见 config.example.yaml);仅空库种子
npm run dev:admin # http://127.0.0.1:5174/
npm run build:admin
npm run test:e2e:admin # Playwrightpreview + mock API,无需 Go
npm run test:e2e:live # 前后台联调(需 deps:up + API :8080;见 e2e-live/
```
## Lint (when configured)
---
```bash
# Go — after golangci-lint is added:
# cd apps/api && golangci-lint run
## CI / production
# H5 — after eslint is added:
# npm run lint -w @yuxingu/user-h5
```
## Migrations (when make targets exist)
```bash
# Preferred once Makefile lands:
# make migrate
# make migrate-down
# Until then: document the goose/migrate command used in the PR.
```
## Dev all (local)
```bash
# terminal 1
cd apps/api && go run ./cmd/server
# terminal 2
npm run dev:h5
```
见 [deployment.md](deployment.md) · [docker.md](docker.md)。
仅在发布/CI 任务使用镜像与 `deploy/docker-compose.prod.yml`
+2
View File
@@ -14,6 +14,8 @@
8. Every feature deployable.
9. Every API documented (OpenAPI or apps/docs).
10. Every database change versioned (migration required).
11. **Local feedback speed > local environment purity.** 本地开发追求分钟级反馈;生产/CI 追求环境一致。二者禁止混用工作流(见 `.ai/environment.md`)。
12. **Done ≠ Code Complete.** 功能完成标准见 `.ai/definition-of-done.md`;禁止仅以「有 API / 能打开页 / build 过」宣告完成。
## Product Laws (YuXinGu)
+18 -9
View File
@@ -1,9 +1,10 @@
# Database — Golden Rules
Schema source of truth for P1 tables: [domain/erd.md](domain/erd.md).
## Naming
- `snake_case` only for tables and columns.
- Good: `user_profile`, `payment_order`, `user_session`.
- Forbidden prefixes: `tbl_`, `t_`.
## Required columns on business tables
@@ -17,9 +18,8 @@ deleted_at
## Types
- Never `varchar(5000)` as a habit.
- Prefer bounded `varchar(n)`.
- `TEXT` only when necessary (long content bodies).
- `TEXT` only when necessary.
- Timestamps: `timestamptz`.
## Keys & indexes
@@ -27,13 +27,22 @@ deleted_at
- Every foreign key indexed.
- Unique business keys enforced with UNIQUE.
## Migrations
## Migration Rules(强制)
- Schema change without migration = incomplete feature.
- Migrations live in `apps/api/migrations/`.
- Provide Up and Down when tool supports it.
1. **Every schema change requires a migration** under `apps/api/migrations/`.
2. **Never** modify production (or shared) databases by hand (`ALTER TABLE` in psql as a substitute for migration).
3. **Migration files are immutable** after merge to `main` — fix forward with a new migration; do not rewrite history on shared branches.
4. **Destructive changes** (drop column/table, type narrowing) require an explicit rollback/forward strategy in the same change set (Down file or follow-up migration + note).
5. App code must not query columns that are not yet migrated.
6. Local apply: start APIauto-migrateor documented migrate command in [commands.md](commands.md).
## Soft delete
- Default: set `deleted_at`, do not hard delete user content in MVP.
- Queries must filter `deleted_at IS NULL` unless explicitly including deleted.
- Default: set `deleted_at`; do not hard-delete user content in P1.
- Queries filter `deleted_at IS NULL` unless the task says otherwise.
## AI MUST NOT
- 「先改库再补 migration」
- 在 handler 里拼临时 DDL
- 发明未在 `domain.md` / `erd.md` 出现的表名(先改文档)
+191 -13
View File
@@ -1,17 +1,195 @@
# Definition of Done
# Definition of Done — AI Quality Gate(强制)
Code finished ≠ Done.
**Done ≠ Code Complete.**
**Done = Feature Complete + Verified + Documented.**
A feature is Done only when applicable items PASS:
任何功能在未满足下列适用标准前,**禁止**对用户说「完成 / Done / P1 Complete」。
若某项 N/A,必须写明原因;静默跳过 = Not Done。
- [ ] Code (compiles / typechecks)
- [ ] API (handler + service + repository as needed)
- [ ] Test (unit or listed smoke for critical paths)
- [ ] Migration (if schema changed)
- [ ] Docker / deploy notes (if new service or env)
- [ ] Docs (OpenAPI / short PRD note if user-visible)
- [ ] Review (`.ai/review.md` checklist output)
- [ ] Build (`go test ./...` and/or `npm run build:h5` for touched side)
- [ ] Health check still green (`/api/v1/healthz`)
加载:每个任务结束前必须对照本文件;见 `AGENTS.md`
If an item is N/A, state why. Silent skip = not Done.
---
## 0. 禁止的「伪完成」信号
仅有下列项 **不足以** 称 Done
- API 路由存在
- 页面能打开
- `go test ./...``npm run build:h5` 通过
- **没有** `product/feature-spec/<id>.md` 却声称功能完整
还缺:Feature Spec、测试分层、异常/空/加载态、权限、完整用户路径、文档与 Review。
---
## 1. Feature 完成(产品层)
必须:
| 项 | 要求 |
|---|---|
| Feature Spec | 存在 `product/feature-spec/<id>.md`;§4 Flow / §7 Rules / §9 API / §12 Acceptance 非空(见 `feature-design.md` |
| Feature Map | 已在 `product/feature-map.md` 定义且范围清晰 |
| 用户路径 | Spec §4 + `user-journey.md` 对应 Step;入口可达 |
| 页面入口 | Spec §5 + `page-tree.md` 路由存在 |
| Loading | 网络请求有加载态(Spec §6) |
| Empty | 无数据有引导(非空白死页) |
| Error | 失败可感知 + 可恢复(重试/返回) |
示例 — 个人画像完整路径(缺一不可称该 Feature Done):
```
进入 → 无档案 → 创建档案 → 生成画像
→ 查看基础版 → 深度版入口 → 支付/mock → 完整分析可见
```
仅有「`/portrait` 显示一段文案」= **Demo / Incomplete**
---
## 2. Backend Done
### 2.1 API
- OpenAPI`proto/openapi.yaml`)已更新
- Request / Response 字段明确
- 错误走统一信封 `{code,message,data}`;业务失败用数字 `code` + 可读 `message`
- **禁止**裸 `{ "error": "..." }` 作为对外约定
### 2.2 分层
```
handler → service → repository → database
```
- 业务逻辑不在 handler
- 权益 / 归属校验在 service(或明确 domain 层),不在前端
### 2.3 测试(见 §4
- 核心 service / engine 有单元测试(Level 1
- P1 关键流有集成测试或可重复的自动化冒烟(Level 2)
---
## 3. Frontend Done
### 3.1 页面四态
每个网络页面必须具备:
| 状态 | 要求 |
|---|---|
| Normal | 成功数据正确展示 |
| Loading | 请求中 |
| Empty | 无档案 / 无列表等引导 |
| Error | 失败文案 + 重试或返回 |
示例 — 问答不能只有聊天壳;至少覆盖:无档案、发送中、失败重试、历史为空(登录态按当前 Visitor 模型裁剪)。
### 3.2 组件
抽公共组件时:可复用、props 明确、状态完整;遵守 `design/component-catalog.md` + lexicon。
### 3.3 文案
用户可见文本符合 `product/lexicon.md`
---
## 4. Test Done(分级)
| Level | 名称 | 最低要求 | P1 Feature |
|---|---|---|---|
| **0** | Build | `go test ./...`;触及 H5 则 `npm run build:h5` | 必须 |
| **1** | Unit | Domain / Service / 算法(如 portrait、relation、scale 计分) | 必须 |
| **2** | Integration | 至少一条端到端 API 流可自动跑 | **P1 关键流必须** |
| **3** | E2E | 浏览器关键路径(Playwright 等) | P1 收口前至少 1 条主路径 |
### P1 必须覆盖的 Integration 流(Level 2
1. **Portrait** create profile → generate portrait → deep_access mock → detail 可见
2. **Relation** two profiles → relation insight → deep_access → tips 可见
3. **Membership(有实现后):** subscribe mock → 权益生效 → 报告完整字段
Level 0 alone ≠ Backend/Frontend Done。
---
## 5. Database Done
- `apps/api/migrations/` 有对应变更
- 新环境:`deps:up` → API 启动 migrate → 可服务
- 破坏性变更有 rollback / forward 策略(见 `database.md`
- Seed 可选但须幂等或可重复说明
禁止手改共享/生产库代替 migration。
---
## 6. Security Done
- 权益(深度版 / 成长会员)**只在服务端**裁剪字段
- 用户只能访问自己的 Profile / Report(归属校验)
- 入参校验;参数化 SQL(无拼接)
- Secret 不入库、不进镜像、不进提交
禁止:前端 `if (vip) showFullReport()` 作为唯一闸门。
---
## 7. AI Review Done
功能声称完成前,**必须**输出:
```markdown
## Review Report
- Feature: <name>
- Scope label: Demo | Feature Complete | P1 Complete | N/A
- Architecture: PASS | FAIL — <note>
- API: PASS | FAIL | N/A — <note>
- Security: PASS | FAIL | N/A — <note>
- Test (L0/L1/L2/L3): PASS | FAIL — <note>
- Frontend states (L/E/E/N): PASS | FAIL | N/A — <note>
- Documentation: PASS | FAIL | N/A — <note>
- Environment: PASS | FAIL | N/A — <note>
- Known Issues: <list or none>
```
任一关键 FAIL → 不得标 Done。
另保留 `.ai/review.md` 细项可一并勾选。
---
## 8. Release Done(版本发布时)
- CHANGELOG
- Migration 说明
- Environment / 配置说明
- Test Result(含 Level
- Rollback Plan
---
## 9. 阶段标签(强制用词)
| 标签 | 含义 |
|---|---|
| **Vertical Slice Demo** | 主路径可演示;缺测/缺态/缺功能仍可存在 |
| **Feature Complete** | 单功能满足本文件 §17 |
| **P1 Complete** | feature-map P1 必做项全部 Feature Complete + L2 三流 + 至少 1 条 L3(或书面豁免经用户同意) |
| **P2 Complete** | feature-map P2 范围全部 Feature Complete + P2 L2 流 + 至少 1 条 P2 L3(真支付除外,见 feature-map |
当前仓库默认状态见:[product/p1-status.md](product/p1-status.md) · [product/p2-status.md](product/p2-status.md)。
---
## 10. 宣称 Done 前的最短自问
1. 用户能否走完 journey,不只是打开页?
2. 无数据 / 失败时页面是否可用?
3. 不付费能否靠改前端看到深度字段?(不应)
4. 新机器按 `commands.md` 能否复现?
5. Review Report 是否已贴出且无 FAIL
+76 -23
View File
@@ -1,33 +1,86 @@
# Deployment — Golden Rules
# Production & CI Deployment — AI Contract
## Containers
本文件只约束 **CI****Production**
本地编码见 [development.md](development.md)Docker 角色见 [docker.md](docker.md)。
- Every runnable service that ships to prod must have a Dockerfile.
- Never use image tag `latest` in production.
- Always semantic version tags: `v0.1.0` or git SHA.
---
## Health
## Production Rules
- Liveness: `GET /api/v1/healthz` required.
- When DB is required for traffic: add readiness endpoint (e.g. `/api/v1/readyz`) that checks DB.
- Alias names `/health` `/readiness` `/liveness` may map to the above; keep one canonical path documented in OpenAPI.
Production **MUST** use immutable images.
## Config
### MUST NOT(生产)
- Secrets via env only. Commit `.env.example`, never `.env`.
- Required: `APP_ENV`, `HTTP_ADDR`, `DATABASE_URL`.
- 服务器上 `git pull` 后直接编译运行当主发布路径
- 手工在机器上 `npm install` / `go mod download` 当发布步骤
- 登录容器改代码或改依赖冒充发布
- 使用镜像 tag `latest`
- 把本地 `.env` / 开发密钥打进镜像
## CI
### Happy path
- No manual prod deploy as the happy path — CI builds and tags.
- Minimum gates: `go test ./...` (api), `npm run build:h5`.
## Local
```bash
docker compose -f deploy/docker-compose.yml up -d
cd apps/api && go run ./cmd/server
npm run dev:h5
```
Git Push → CI → Test → Build Image → Registry → Deploy → Health Check
```
If Go module download times out in CN: `export GOPROXY=https://goproxy.cn,direct`.
### Health
- Liveness: `GET /api/v1/healthz`(必须)
- Readiness(有 DB 流量时): `GET /api/v1/readyz`(检查 DB;可后补)
- Canonical paths 写入 OpenAPI
### Config
- Secrets **仅**环境变量 / 密钥管理系统
- 提交 `deploy/.env.example`,永不提交 `.env`
- 生产必备示例:`APP_ENV=prod` `HTTP_ADDR` `DATABASE_URL`(及日后支付/JWT 密钥)
### Containers
- 可运行的生产服务最终应有 Dockerfile(`deploy/Dockerfile.*`
- Tag`v0.x.y` 或 git SHA
### Deployment Target(预留,勿提前复杂化)
| Phase | Target | When |
|---|---|---|
| **1** | Docker Compose on a VPS | 首版上线默认 |
| **2** | Managed containers(云厂商容器服务) | 运维成本上去时 |
| **3** | Kubernetes | 明确有多服务/扩缩容需求时 |
P1 **不要**引入 K8s。缺的 Dockerfile / prod compose **按发布任务再加**,不为本地写代码先造全套镜像工作流。
### TopologyPhase 1 目标)
```
Docker Compose (VPS)
├── Go API container
├── Nginxuser-h5 静态或反代)
├── PostgreSQL
├── Redis(需要时)
└── Object storage(需要时)
```
---
## CI Rules
CI 优先 **一致性**
- `go test ./...``apps/api`
- `npm run build:h5`
- (有 Dockerfile 后)build 镜像 smoke
- 不在 CI 里要求开发者本机 Docker Desktop 才能合并文档/纯前端 PR(按 job 需要)
---
## Local vs Prod(对照)
| Topic | Local | Production |
|---|---|---|
| Go / Vue | 本机热更 | 镜像 |
| Postgres | `docker-compose.dev.yml` | 托管或 compose/k8s |
| 反馈 | 分钟级 | 发布质量与回滚 |
| 配置 | `.env.local` / dev | 密钥系统 / prod env |
禁止把右栏流程套到左栏日常开发。
+3
View File
@@ -4,6 +4,7 @@ Machine-readable **UI/UX/VI contract** for agents generating H5 / Mini Program /
| File | Purpose |
|---|---|
| **[reverse-engineering-spec.md](reverse-engineering-spec.md)** | **竞品/成熟 App 逆向工程设计规范(V1.0)** · Evidence First · STEP 118 |
| [design-system.md](design-system.md) | Foundation: tokens, color, type, spacing, motion, voice |
| [component-catalog.md](component-catalog.md) | Button / Card / Chat / Report / Membership … |
| [platform/h5.md](platform/h5.md) | Mobile Web implementation limits |
@@ -13,3 +14,5 @@ Machine-readable **UI/UX/VI contract** for agents generating H5 / Mini Program /
Runtime tokens: `packages/ui/src/tokens.css`
Product chrome / tabs: `../ui.md`
对标测测等成熟 App 时:**先按 reverse-engineering-spec 做完整逆向**,再映射 lexicon / feature-spec 后编码。禁止只出 Demo/MVP 式省略分析。
+5 -5
View File
@@ -118,11 +118,11 @@ Surface white, `--radius-lg`, `--shadow-card`. No random card skins.
Status: **required** — Explore entry (icon + title + one line).
### ReportCard
### ReportCard(成长报告卡)
Status: **required**
Decode / Match summary. Shows free conclusion; locked sections use PaywallLock. Footer disclaimer slot.
Portrait / RelationInsight summary. Free base conclusion; locked sections use PaywallLock(文案用「深度版」). Footer disclaimer.
### MoodCard
@@ -138,9 +138,9 @@ Status: **required**
Membership plans. Clear price · period · benefits. **MUST NOT** fake countdown / dark patterns. CTA = Primary Button.
### UnlockCard
### DeepAccessCard
Status: **required**single Report / Match Unlock alternative to VIP.
Status: **required**单次深度版成长报告 / 关系理解完整建议(替代 VIP 订阅)。
---
@@ -180,7 +180,7 @@ Status: **required** — Self / Other list; “帮 TA 测” entry.
### ShareCard
Status: **required**Decode / ScaleResult share visual; brand + one conclusion line; no medical claims.
Status: **required**探索结果 / 画像关键词分享;品牌 + 一句结论;无医疗与占卜声称。
### ScaleQuestion / ScaleResultView
+2 -1
View File
@@ -248,7 +248,8 @@ Contrast for body text; touch ≥ 44px; no hover-only essentials; label interact
## 13. Brand Voice
温和、清晰、尊重。禁止恐吓 / 道德绑架 / 虚假倒计时.
Report/Ask: lifestyle disclaimer(非医疗、非算命. Labels follow `.ai/domain.md`.
成长报告 / 问答:生活建议向免责声明(非医疗、非占卜.
**中文命名强制:** `.ai/product/lexicon.md`(无「解码/运势/合盘/解锁」等禁用主文案).
---
+265
View File
@@ -0,0 +1,265 @@
# AI Reverse Engineering Design Specification (V1.0)
> **项目级设计规范** · 适用于 Claude Code / Cursor / GPT / Gemini 等全部 AI
> 场景:对标成熟 App(如测测)做**能力与系统逆向**,输出可直接支撑工程落地的完整设计
> 冲突优先级见文末「与愈心谷契约的关系」
---
## 1. Mission
你不是产品经理,也不是程序员。
你的身份是:
**Senior Reverse Engineering Architect**
你的目标不是设计一个「类似功能」,而是:
**完整还原目标 App 的功能、业务逻辑、数据结构、状态机和运营体系。**
任何输出都必须以:
- **Production Ready**
- **Enterprise Ready**
- **Feature Complete**
作为目标。
| 禁止 | 必须 |
|---|---|
| Demo | 可支撑前后端 + 运营完整链路 |
| MVP(作为终点) | Feature Complete 分析 |
| 为简单而省略 | 全部展开 |
| 只描述页面外观 | 推导页面背后的系统 |
---
## 2. Reverse Engineering Rule
每一个页面都必须认为:
> 你看到的只是冰山一角。
> 页面背后一定存在:业务逻辑 · 数据库 · 后台 · 缓存 · 状态机 · 运营 · 统计 · 权限 · 异常处理 · 日志 · 配置 · 监控 ……
你的任务就是**全部推导出来**。
---
## 3. Completeness Principle
任何功能**禁止**输出:
- 应该 / 可能 / 大概
- 简单实现 / 略 / TODO / 以后再做
必须全部展开。缺一项即未完成。
---
## 4. Evidence First(证据优先)
每一项分析必须标注来源,禁止把猜测写成事实。
| 标记 | 含义 |
|---|---|
| ✅ UI 证据 | 页面上确实存在的元素(截图/真机/录屏) |
| ✅ 行为证据 | 根据可复现交互确定的流程(点击、跳转、接口回包) |
| 🟡 推断 | 根据行业经验 / 同类产品惯例推导 |
| 🔵 工程建议 | 为保证系统完整性补充(原 App 未必公开可见) |
输出表格建议格式:
| 推导内容 | 来源 |
|---|---|
| … | ✅ UI 证据 / ✅ 行为证据 / 🟡 推断 / 🔵 工程建议 |
**「我看到了什么」与「我推断了什么」必须分开。**
---
## 5. Reverse Engineering Workflow
每分析一个页面(或一条完整用户能力),**严格按下列顺序,禁止跳步。**
### STEP 1 — 页面分析(UI Analysis
必须列出:
页面组成 · 所有区域 · 所有按钮 · 所有 Icon · 所有文本 · 所有图片 · 所有 Banner · 所有卡片 · 所有列表 · 所有 Tab · 所有浮窗 · 所有弹窗 · 所有菜单 · 所有动画
要求:不能遗漏任何可见元素。每项尽量带 ✅ UI 证据。
### STEP 2 — 功能分析(Feature Analysis
对页面上每一个元素,必须回答:
- 有什么作用?
- 点击后发生什么?长按?双击?
- 是否可分享 / 复制 / 删除 / 收藏 / 举报 / 编辑?
- 是否有权限限制 / VIP 限制 / 登录限制?
### STEP 3 — 用户流程(User Flow
画出完整主流程:
```text
进入 → 加载 → 成功 → 操作 → 提交 → 返回 → 退出
```
同时必须覆盖失败与边界:
网络错误 · Token 失效 · 服务器异常 · 权限不足 · 数据为空 · 会员限制 · 余额不足 · 接口超时 · 审核失败
### STEP 4 — 状态机(State Machine
每个页面必须列出状态(至少覆盖):
Init · Loading · Refreshing · Loaded · Empty · Offline · Error · PermissionDenied · LoginRequired · VIPLocked · Submitting · Success · Failed · Retrying · Deleted · Disabled · Hidden
并给出**状态转换图**(可用 mermaid)。
### STEP 5 — 数据模型(Data Model
推导所有对象(如 User / Profile / AstrologyChart / Order / Membership / Notification …)。
每个字段必须写:字段 · 类型 · 是否为空 · 默认值 · 来源 · 用途 · 是否缓存 · 是否索引 · **证据标记**
### STEP 6 — 数据库设计
推导表结构(含运营/审计表)。每张表:字段 · 主键 · 唯一索引 · 普通索引 · 外键 · 更新时间 · 删除策略。
落地到本仓库时,同步 `.ai/domain/erd.md` 与 migrations。
### STEP 7 — API Reverse Engineering
每个接口必须包含:
URL · Method · Request · Response · ErrorCode · RateLimit · Permission · Cache · Retry
标准:可以直接开发(并对齐本仓 OpenAPI 切片)。
### STEP 8 — 后台运营系统
任何前台功能必须推导后台:
Banner · 推荐位 · 内容审核 · 用户管理 · 订单管理 · 会员配置 · 活动配置 · 推送 · 统计 · 运营位 · AB Test · 配置中心
无 UI 证据的后台能力标 🟡/🔵,不可省略整类。
### STEP 9 — 权限系统
推导角色:游客 · 登录用户 · VIP · SVIP · 管理员 · 运营 · 客服 · 审核员 · 超级管理员
每个角色:能做什么 / 不能做什么。映射到本产品时对齐现有 Visitor / DeepAccess / Membership(见 feature-spec)。
### STEP 10 — 支付系统
若涉及:订单 · 退款 · 支付状态 · 失败/取消 · 重复支付 · 补单 · 风控 · 发票。
本仓当前可用 `pay-mock`;完整支付链路仍须在 Spec 中写清状态机,实现可分期。
### STEP 11 — 消息系统
Push · 站内信 · 短信 · 邮件 · 消息中心 · 未读数 · 角标 · 通知策略。
### STEP 12 — 埋点系统
页面曝光 · 按钮点击 · 停留 · 漏斗 · 转化 · 留存 · 分享 · 支付 · 搜索 · 异常。
事件名过 `.ai/product/feature-spec/analytics.md` 与 lexicon。
### STEP 13 — 配置系统
哪些后台可配 / 写死 / 远程配置 / 灰度 / AB。
### STEP 14 — 缓存策略
本地缓存 · Redis · CDN · 图片 · 分页 · 用户 · 配置。
### STEP 15 — 异常处理
断网 · 弱网 · 超时 · 重复点击 · Token 失效 · 数据损坏 · 接口升级 · 版本过低 · 审核失败 · 资源不存在。
### STEP 16 — 日志系统
用户日志 · 错误日志 · 接口日志 · 支付日志 · 审核日志 · 运营日志 · 安全日志。
### STEP 17 — 安全分析
权限 · SQL 注入 · XSS · CSRF · 重放 · 验证码 · 风控 · 设备绑定 · 账号安全。
并遵守 `.ai/security.md`
### STEP 18 — 可扩展性
未来增量 · DB 扩展 · API 兼容 · 模块解耦。
---
## 6. Completeness Checklist
输出结束前必须自检(任一项未分析则**不得结束**):
- [ ] 页面 / 按钮 / 弹窗
- [ ] 用户流程 / 异常流程
- [ ] API / 数据库
- [ ] 后台 / 权限 / 支付
- [ ] 配置 / 埋点 / 日志
- [ ] 安全 / 扩展
- [ ] 每条关键结论带 Evidence 标记
---
## 7. Output Quality Standard
每个功能分析必须达到:
| 维度 | 标准 |
|---|---|
| Feature Complete | ★★★★★ |
| Production Ready | ★★★★★ |
| Enterprise Ready | ★★★★★ |
| Reverse Engineering Complete | ★★★★★ |
**不合格**:只描述页面或功能文案。
**合格**:开发团队可据此直接实现完整链路(前台 · 后台 · 接口 · 数据 · 运营),且证据层级清晰。
分析产物默认写入:
1. `product/feature-spec/<id>.md`(用户可见能力与规则;过 lexicon)
2. 必要时附 `product/feature-spec/<id>-re.md` 或同目录附录(完整 STEP 1–18 逆向底稿)
3. 同步 `erd` / OpenAPI / `page-tree` / `feature-map` / analytics
---
## 8. 与愈心谷契约的关系(强制)
本规范解决的是:**能力与系统如何被完整逆向出来**。
落地品牌与禁词仍由产品契约约束:
| 层级 | 文档 | 作用 |
|---|---|---|
| 最高 | `product/lexicon.md` | 用户可见中文;硬禁「占卜/算命」恐吓等 |
| 战略 | `product/STRATEGY.md` | 参考竞品模型 ≠ 复制竞品品牌/视觉 |
| 能力树 | `product/feature-map.md` | 分期与边界 |
| 本规范 | `design/reverse-engineering-spec.md` | 逆向分析深度与完整性 |
| 功能输入 | `product/feature-design.md` + `feature-spec/*` | 开发唯一功能输入 |
**允许**:对标测测(或其它竞品)做 STEP 1–18 完整逆向,追求 Feature Complete 系统设计。
**禁止**:在 UI/PRD/Ask 中自称「测测」;照搬竞品商标、独特视觉品牌资产;违反 lexicon 的恐吓/疗效话术。
**落地命名**:逆向结论映射为愈心谷模块名(如「星座」「合盘」),写入 feature-spec 后再编码。
分期现实:逆向分析可以一次性 Feature Complete**实现**仍按 `feature-map` 分期切片,但 Spec/附录不得用「以后再做」糊弄——未实现项标为「分期未交付」并保留完整设计。
---
## 9. AI 使用方式
| 任务类型 | 必须加载 |
|---|---|
| 对标竞品 / 补齐合盘·星座等能力 | 本文件 + lexicon + feature-design + 对应 feature-spec |
| 从截图/录屏做页面逆向 | 本文件 Workflow STEP 1→18,禁止跳步 |
| 写/改 Feature Spec | feature-design + 本文件 Checklist + Evidence First |
| 编码实现 | Spec 已 Active 且 §12 可测;本文件不替代 coding/DoD |
一句话口令:
> 你的任务不是设计一个差不多的功能,而是逆向工程:证据优先、系统完整、可直接工程落地;品牌与禁词服从愈心谷 lexicon。
+105
View File
@@ -0,0 +1,105 @@
# Local Development Rules — AI Contract
**目标:** 快速修改、快速验证、快速调试(分钟级反馈)。
**不是目标:** 把笔记本变成迷你生产集群。
总原则见 [environment.md](environment.md)。
---
## MUST
1. Go API:本机 `go run` / **air** 热更新。
2. user-h5:本机 **Node + Vite**`npm run dev:h5`)。
3. 依赖数据服务(Postgres;日后 Redis 等):`docker compose -f docker-compose.dev.yml up -d`
4. 配置:根目录或 `apps/api` 使用 `.env` / `.env.local`(不提交);模板见 `deploy/.env.example`
5. H5 通过 Vite proxy 访问本机 API`/api``127.0.0.1:8080`),无需把前端放进容器。
6. 验证优先:`go test``curl healthz`、浏览器 / Vite,而不是先写 Dockerfile。
## MUST NOT
- 每次改 Go/Vue 代码就 `docker build` 应用镜像再跑。
- 用 production image / `APP_ENV=prod` 做日常开发。
- `docker compose` 启动 **api + web** 作为默认本地工作流(除非任务明确是「验证 compose 集成」)。
- 将本地环境完全等同生产(密钥、域名、副本数、对象存储真集群等)。
- 把密钥写进 compose 或镜像层。
---
## Recommended local topology
```
Host (macOS / Linux)
├── Go 1.22+
│ ├── go run ./cmd/server 或 air
│ └── delve(可选调试)
├── Node 20+npm workspaces;可选 pnpm
│ └── Vite → :5173
└── Docker Desktop(仅服务)
├── PostgreSQL :5432
├── Redis(需要时再加)
└── Object storage(需要时再加)
```
---
## Go Backend
| Item | Local |
|---|---|
| Runtime | 本机 Go |
| Entry | `apps/api` |
| Hot reload | 推荐 [air](https://github.com/air-verse/air);配置 `.air.toml`(可选) |
| Env | `HTTP_ADDR=:8080` `DATABASE_URL=postgres://yuxingu:yuxingu@127.0.0.1:5432/yuxingu?sslmode=disable` `APP_ENV=dev` |
| Migrate | API 启动时自动应用 `apps/api/migrations/*.up.sql` |
| CN proxy | `export GOPROXY=https://goproxy.cn,direct` |
```bash
# terminal — deps
docker compose -f docker-compose.dev.yml up -d
# terminal — API
cd apps/api
go run ./cmd/server
# 或: air
```
## Vue H5
| Item | Local |
|---|---|
| Runtime | 本机 Node |
| Dev | `npm run dev:h5` → http://127.0.0.1:5173 |
| Build check | `npm run build:h5` |
```bash
npm install
npm run dev:h5
```
## Database / deps only
```bash
docker compose -f docker-compose.dev.yml up -d # postgres
docker compose -f docker-compose.dev.yml down
docker compose -f docker-compose.dev.yml logs -f postgres
```
只起依赖,**不起** api / web / worker。
---
## Auth note (P1 local)
访客身份:`X-Device-Key`H5 存 `localStorage.yxg_device_key`)。
无需为本地开发先搭完整 JWT,除非任务是登录竖切。
---
## Before claiming Done (local)
- [ ] 未引入「Docker-only 改代码」流程
- [ ] API 本机可 `healthz`
- [ ] H5 本机 Vite 可打开
- [ ] DB 用 compose.dev,而非把业务进程塞进同一默认 compose
+70
View File
@@ -0,0 +1,70 @@
# Docker Policy — AI Contract
## Docker SHOULD be used for
| ✓ | Examples |
|---|---|
| 依赖数据服务 | PostgreSQL |
| 缓存 | Redis(需要时) |
| 消息队列 | 需要时再加 |
| 对象存储 | MinIO / S3 兼容(需要时) |
| 第三方依赖模拟 | mailhog 等(需要时) |
| 生产/CI 应用交付 | 不可变 api / web 镜像 |
## Docker SHOULD NOT be used for
| ✗ | Why |
|---|---|
| Go API 日常开发 | 拖慢反馈;用本机 `go run` / `air` |
| Vue H5 日常开发 | 拖慢 HMR;用本机 Vite |
| Hot reload 工作流 | 禁止「改代码 → docker build → run」 |
| 把本机当成迷你 K8s | 违反 constitution:本地反馈速度优先 |
见 [development.md](development.md) · [environment.md](environment.md)。
---
## Local composedeps only
| File | Role |
|---|---|
| `docker-compose.dev.yml`(仓库根) | **默认本地**:仅依赖服务 |
| `deploy/docker-compose.yml` | 与 dev 对齐的依赖入口(兼容旧命令);生产见 prod 文件 |
```bash
docker compose -f docker-compose.dev.yml up -d
```
**允许的服务(local):** `postgres`+ 需要时 `redis` / `minio`
**禁止默认加入(local):** `api` · `user-h5` · `worker` · `nginx`
---
## Production / CI images
| Artifact | Location (target) |
|---|---|
| Backend Dockerfile | `deploy/Dockerfile.api`(按需新增) |
| H5/Nginx Dockerfile | `deploy/Dockerfile.user-h5`(按需新增) |
| Prod compose / K8s | `deploy/docker-compose.prod.yml` 等 |
生产镜像规则见 [deployment.md](deployment.md):禁止 `latest`;语义化版本或 git SHA。
---
## AI MUST NOT
- 把「本地开发」文档写成只能 `docker compose up` 全栈。
- 在业务 PR 里强制同事每次改代码都 build 应用镜像。
-`.env` 秘密 `COPY` 进镜像。
- 混用 `docker-compose.dev.yml` 与 prod 环境变量文件。
---
## When full-stack compose is OK
仅当任务明确是:
- 验证 prod compose / 镜像入口
- CI integration job
- 演示「一键依赖+应用」给非开发角色(仍非日常编码默认)
+39 -52
View File
@@ -1,65 +1,52 @@
# Domain Language — Ubiquitous Terms
Use ONLY these words in code, API, UI copy (Chinese labels noted).
Do not invent synonyms (Customer / Client / Account) unless added here via ADR.
Use ONLY these words in code and API.
**User-facing Chinese:** [product/lexicon.md](product/lexicon.md)
**Feature tree:** [product/feature-map.md](product/feature-map.md)
**Contexts / ER:** [domain/domain-map.md](domain/domain-map.md) · [domain/erd.md](domain/erd.md)
**Bounded contexts / aggregates / ER:** [domain/domain-map.md](domain/domain-map.md)
**Product feature tree:** [product/feature-map.md](product/feature-map.md)
---
## Identity & access
## Tech → User (frozen)
| Term | Meaning | Not |
|---|---|---|
| **Visitor** | 未登录访客;可有匿名 device id | Guest(勿混用) |
| **User** | 已注册主体(有 user id | Customer / Client |
| **Member** | 同 User:已注册用户的业务称呼;代码字段优先 `user` | — |
| **VIP** | 付费会员期内的 Usermembership active | Member(勿把所有注册用户叫 VIP) |
| **Session** | 登录态 / token 会话 | — |
| Tech | User CN |
|---|---|
| Profile | 个人档案 |
| Portrait | 个人画像 |
| Scale | 探索测试 |
| ScaleResult / Result | 探索结果 |
| GrowthReport | 成长报告 |
| RelationInsight | 关系理解 |
| Ask | AI成长助手(Tab:问答) |
| Memory | 成长记录 |
| Mood | 心情记录 |
| SolarTerm | 节气生活 |
| Membership | 成长会员 |
| DeepAccess | 深度版 |
| Constitution | 身心探索 |
| StarProfile | 星象性格(P2 |
| LifeRhythm | 身心节律(P2 |
| ImageCard | 意象卡片(P2 |
## Commerce
Deprecated aliases: Decode→Portrait · Match→RelationInsight · Unlock→DeepAccess · Tarot→ImageCard
Never invent package names: `horoscope_luck`, `tarot`(用户域用 `image_card` / `star_profile` / `life_rhythm`)。
---
## Identity
| Term | Meaning |
|---|---|
| **Subscription** | 会员订阅计划(月/季/年) |
| **Membership** | 用户当前会员权益状态(是否 VIP、到期时间、额度) |
| **Order** | 支付订单(报告解锁或订阅) |
| **Payment** | 一笔支付尝试 / 渠道回调结果 |
| **Refund** | 退款记录 |
| **Unlock** | 对某 Report 的购买解锁(非 VIP 也可单次解锁) |
| **Visitor** | 匿名访客 + device id |
| **User** | 注册主体 |
| **VIP** | Membership active |
| **Session** | token 会话 |
## Profile & content
---
| Term | Meaning |
|---|---|
| **Profile** | 档案:自己或 TA 的生日等输入 |
| **Self Profile** | relation = self |
| **Other Profile** | relation = otherTA |
| **Decode** | 愈心解码报告(数字性格 + 体质建议) |
| **Report** | 统称:Decode / Match / 尊享报告等可交付物 |
| **Match** | 双人/家庭契合度报告 |
| **Scale** | 心理量表 |
| **ScaleResult** | 量表作答与计分结果 |
## Core aggregates (names for packages/tables)
## Retention & AI
`user` · `profile` · `portrait` · `scale` · `scale_result` · `growth_report` · `relation_insight` · `ask_thread` · `ask_message` · `mood` · `memory_item` · `subscription` · `membership` · `order` · `payment` · `deep_access`
| Term | Meaning |
|---|---|
| **Companion** | 陪伴域:节气、心情 |
| **SolarTerm** | 二十四节气内容单元 |
| **Mood** | 每日心情打卡 |
| **Ask** | 「问」能力:基于 Profile 的解读对话 |
| **Consult** | 真人顾问咨询(后置) |
## Platform
| Term | Meaning |
|---|---|
| **user-h5** | 用户 H5 客户端 |
| **mini-program** | 微信小程序客户端 |
| **api** | Go 后端唯一服务 |
| **Legacy** | 根目录旧静态原型,只读 |
## Naming in code
- Go packages / JSON: `user`, `profile`, `report`, `order`, `membership`, `scale`
- Never: `customer`, `client` (except HTTP client), `account` (unless wallet later + ADR)
Never invent: `customer`, `decode`, `horoscope_luck`, `tarot` packages for P1.
+9 -3
View File
@@ -1,6 +1,12 @@
# Domain docs
# Domain
| File | Purpose |
|---|---|
| [../domain.md](../domain.md) | Ubiquitous language — terms only |
| [domain-map.md](domain-map.md) | Bounded contexts, aggregates, ER sketch |
| [../domain.md](../domain.md) | Tech ↔ 用户名 |
| [domain-map.md](domain-map.md) | Bounded contextsP1 冻结 + Ops Wave 0 Draft |
| [erd.md](erd.md) | P1 表结构草案(冻结) |
| [boundary-rules.md](boundary-rules.md) | BC owns / allowed / forbidden**P0** · Wave 0 |
| [glossary.yaml](glossary.yaml) | 工程/API 唯一词(与 lexicon 双轨) |
| [entity-catalog.md](entity-catalog.md) | 概念级实体目录(无 migration |
Ops Contract-First 归档:`docs/WAVE0/`
+239
View File
@@ -0,0 +1,239 @@
# Bounded Context Boundary Rules
> Wave 0 · **P0 资产** · AI / Engineer 只读;变更须 Architect + Human
> 运行时权威副本:`.ai/domain/boundary-rules.md`
Status: `Draft`Human Review 后 Frozen
---
## 如何读
- **owns**:该 BC **唯一写权威**(修改入口)。
- **does_not_own**:明示禁止「顺手改」。
- **allowed**:允许的依赖(多为读或经门面)。
- **forbidden**:禁止的依赖(含跨 BC 写支付/会员等)。
违反本文件 = Reviewer **BLOCK**(架构回归)。
---
## Admin_Auth_Audit
```yaml
Admin_Auth_Audit:
owns:
- AdminAccount
- AdminSession
- AuditLog
does_not_own:
- UserStatus
- MembershipPlan
- Entitlement
allowed:
- Admin_RBAC.read
forbidden:
- Payment.write
- C端业务聚合根的隐式写入
```
## Admin_RBAC
```yaml
Admin_RBAC:
owns:
- AdminRole
- AdminPermission
does_not_own:
- User
- Profile
- Membership
allowed:
- Admin_Auth_Audit.write_audit
forbidden:
- Payment
- Membership.write
- DeviceAuth.user_token_issue
```
## Identity_Profile
```yaml
Identity_Profile:
owns:
- User
- Profile
- DeviceIdentity
- UserStatus
- BehaviorSnapshot
- PsychologicalTagSet
does_not_own:
- MembershipPlan
- Entitlement
- Order
- Payment
- RedemptionCode
allowed:
- Analytics_OpsB.read
forbidden:
- Payment
- Membership.write
```
## Membership_Orders
```yaml
Membership_Orders:
owns:
- MembershipPlan
- Entitlement
- Membership
- Order
- DeepAccess
- RedemptionCode
- Payment # mock 今;真支付适配器后置,仍归本 BC
does_not_own:
- UserStatus
- AdminRole
- FilterRule
allowed:
- Identity_Profile.read
forbidden:
- Ask_Ops.write_prompt
- Content_Safety.rule_mutate_via_order
```
## Analytics_OpsB
```yaml
Analytics_OpsB:
owns:
- AnalyticsSession
- AnalyticsEvent
does_not_own:
- User
- Membership
allowed:
- Identity_Profile.read_ids_only
forbidden:
- Payment
- 采集 PII 正文(生日/问答全文等)
```
## Ops_Content
```yaml
Ops_Content:
owns:
- HomeTool
- ScalePublishState
does_not_own:
- Scale 题目正文编辑器(未开 ECR 前禁止扩张)
allowed:
- Explore_Reports.publish_gate
forbidden:
- Community
- Payment
```
## Account_Risk
```yaml
Account_Risk:
owns:
- RiskFlag
- BanRecord
does_not_own:
- MembershipPlan
allowed:
- Identity_Profile.UserStatus.transition # 经明确应用服务
- Admin_Auth_Audit.write_audit
forbidden:
- Payment.refund_silent
```
## Content_Safety
```yaml
Content_Safety:
owns:
- FilterRule
- ModerationCase
- BlockPolicy
- CrisisEvent
- CrisisPolicy
does_not_own:
- Membership
- Payment
- AdminRole
allowed:
- Identity_Profile.read
- Ask_Ops.read_session_meta
forbidden:
- Membership.write
- Payment
```
## Ask_Ops
```yaml
Ask_Ops:
owns:
- AskSessionView
- QualityFeedback
- HandoffCase
- SystemPrompt
- KnowledgeSource
- KnowledgeChunk
- ToolDefinition
does_not_own:
- Payment
- MembershipPlan
- UserStatus
allowed:
- Identity_Profile.read
- Content_Safety.evaluate
forbidden:
- Payment
- Membership.write
- Admin_RBAC.write
```
## Ops_CMS_NoUGC
```yaml
Ops_CMS_NoUGC:
owns:
- Banner
- FeedSlot
- ScheduledPublication
does_not_own:
- UGC Post
- CommentGraph
- TrustScore
allowed:
- Admin_RBAC.check
forbidden:
- Community
- 用户生成内容入库为主路径
```
## Community
```yaml
Community:
status: Forbidden
owns: []
note: feature-map UGC 广场 [No];开启须 L3 ADR + 新 Capability
```
---
## 反模式(禁止)
```text
AskService → load User → update Membership → charge Payment
UserService.updateMembership()
Content_Safety 直接改 Entitlement
Ops_CMS 引入「用户帖子」表却声称 NoUGC
```
+54 -172
View File
@@ -1,183 +1,65 @@
# Domain Map — 愈心谷(DDD 视角
# Domain Map — 冻结(P1 工程真源
给后端 / DB / OpenAPI / SDK 用的**能力域与实体图**。
词汇以 [../domain.md](../domain.md) 为准;产品范围以 [../product/feature-map.md](../product/feature-map.md) 为准。
竞品能力对照:[../product/cece-feature-map.md](../product/cece-feature-map.md)。
AI 生成表结构或 API 时:先落本图中的 Context / Aggregate,再写 migration;禁止发明未列出的聚合根名。
变更本文件或 ERD 需简短 ADR。词汇:[../domain.md](../domain.md) · ERD[erd.md](erd.md) · API`proto/openapi.yaml` · Go 边界:[../architecture/go-services.md](../architecture/go-services.md)
---
## 1. Bounded Contexts
## Bounded Contexts
| Context | Aggregates | P1 | Owner package |
|---|---|---|---|
| Identity | User, Session, DeviceIdentity | Yes | `internal/service/user` |
| Profile | Profile | Yes | `internal/service/profile` |
| Discovery | Portrait, Scale, ScaleResult, GrowthReport | Yes | `portrait`, `scale`, `report` |
| Relation | RelationInsight | Yes **必做** | `relation` |
| Ask | AskThread, AskMessage, AskQuota | Demo(规则引擎) | `ask` |
| Companion | Mood, SolarTerm | P2 | `internal/companion` · `/solar-terms/today` · `/moods` |
| StarProfile | StarProfile report | P2 | `internal/star` · `POST /reports/star` |
| LifeRhythm | LifeRhythm / Constitution | P2 | `internal/rhythm` · `POST /reports/rhythm` |
| ImageCard | ImageCard draw + deck | P2 | `internal/imagecard` · `/image-cards/*` |
| Memory | MemoryItem | P2/P3 | `memory` |
| Commerce | Subscription, Membership, Order, Payment, DeepAccess | Yes mock | `order`, `membership` |
| Consult | — | P3 | — |
---
## Ops Platform Bounded ContextsWave 0 Draft
> 详细 owns/forbidden[`boundary-rules.md`](boundary-rules.md) · 词表:[`glossary.yaml`](glossary.yaml) · 实体:[`entity-catalog.md`](entity-catalog.md)
> 归档:`docs/WAVE0/domain/` · Capability`docs/WAVE0/capability/ops-capability-map.md`
> **不修改**上方 P1 不变量;Ops BC 实现须独立 ECR。
| Context | Capability | Status |
|---|---|---|
| Admin_Auth_Audit | AdminGovernance | Shipped Ops-A |
| Admin_RBAC | AdminGovernance | Draft → ECR-013A |
| Analytics_OpsB | GrowthInsights / UserIntelligence(read) | Shipped Ops-B |
| Ops_Content | ExploreConfig (partial) | Shipped Ops-C |
| Account_Risk | AccountLifecycle | Spec via ECR-013BIdentity_Profile owns UserStatus |
| Content_Safety | ContentSafety · CrisisCare | ContentSafety **ECR-019**CrisisCare **ECR-022**CrisisPolicy 只读) |
| Ask_Ops | AskOperations · AICoreConfig | AskOperations **ECR-017/020**AICoreConfig **ECR-021**SystemPrompt 只读) |
| Ops_CMS_NoUGC | OpsCMS | Draft |
| Community | — | **Forbidden** |
---
## Context diagram
```
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Identity │──▶│ Profile │──▶│ Discovery │
│ (User) │ │ Life Archive│ │ Decode/Scale│
└─────────────┘ └──────┬───────┘ └──────┬──────┘
│ │
▼ ▼
┌──────────────┐ ┌─────────────┐
│ Relationship │ │ Ask │
│ Match │ │ Companion │
└──────┬───────┘ └──────┬──────┘
│ │
▼ ▼
┌─────────────────────────────────┐
│ Commerce │
│ Subscription / Order / Unlock │
└─────────────────────────────────┘
┌──────────────┼──────────────┐
▼ ▼ ▼
ContentFeed GrowthShare Consult(*)
(* later)
Identity → Profile → Discovery(Portrait/Scale/GrowthReport)
↘ RelationInsight ← P1 双引擎
↘ Ask (+ Memory later)
↘ Companion
Commerce(DeepAccess/Membership)
```
| Context | 职责 | MVP |
|---|---|---|
| **Identity** | Visitor/User/Session | Yes |
| **Profile** | Self/Other 生命档案 | Yes |
| **Discovery** | Decode、Scale、Report 生成 | Yes |
| **Relationship** | Match | Yes |
| **Ask** | 档案上下文对话、额度 | Skeleton |
| **Companion** | SolarTerm、Mood | Skeleton |
| **Commerce** | Subscription、Membership、Order、Unlock、Payment | Yes (mock) |
| **Content** | Feed 配置 | Static OK |
| **Growth** | Share 卡片元数据 | Minimal |
| **Consult** | 真人顾问 Marketplace | No |
| **Recommendation** | 推荐 | V1 rules |
---
## 2. Aggregates & Entities(命名强制)
## Invariants
### Identity
| Type | Name | Notes |
|---|---|---|
| Aggregate | **User** | 注册主体 |
| Entity | Session | token 会话 |
| Entity | DeviceIdentity | Visitor 匿名 |
### Profile(生命档案)
| Type | Name | Notes |
|---|---|---|
| Aggregate | **Profile** | `relation`: self \| other |
| VO | BirthInput | datetime/place optional later |
| VO | RelationType | partner/family/friend/… |
### Discovery
| Type | Name | Notes |
|---|---|---|
| Aggregate | **Report** | type: decode \| match \| … |
| Domain Svc | DecodeEngine | 可复算;结果入 Report |
| Aggregate | **Scale** | 量表定义 |
| Entity | ScaleQuestion | |
| Aggregate | **ScaleResult** | 作答 + 计分 |
### Relationship
| Type | Name | Notes |
|---|---|---|
| Aggregate | **Match** | 引用两个 Profile;产出 Report 或嵌入 |
### Ask / Companion
| Type | Name | Notes |
|---|---|---|
| Aggregate | **AskThread** | 挂 profile_id |
| Entity | AskMessage | role user/assistant |
| Entity | AskQuota | 与 Membership 联动 |
| Aggregate | **Mood** | 日维度打卡 |
| Read Model | **SolarTerm** | 日历内容;可配置表 |
### Commerce
| Type | Name | Notes |
|---|---|---|
| Aggregate | **Subscription** | 计划 SKU |
| Aggregate | **Membership** | 用户权益状态 |
| Aggregate | **Order** | 订阅或 Unlock |
| Entity | Payment | mock / 渠道 |
| Entity | Unlock | order → report 解锁 |
### Content / Growth(薄)
| Type | Name | Notes |
|---|---|---|
| Entity | FeedItem | 运营配置 |
| VO | SharePayload | 分享卡字段 |
### ConsultLater
| Type | Name | Notes |
|---|---|---|
| Aggregate | Consultant | |
| Aggregate | ConsultOrder | |
| Entity | ConsultSession | |
---
## 3. 关键关系(ER 草图)
```
User 1──* Profile
Profile 1──* Report
Profile 1──* AskThread
User 1──* ScaleResult
User 1──0..1 Membership
User 1──* Order
Order 0..1── Unlock ──▶ Report
Profile ── Match ── Profile
User 1──* Mood
```
权益规则:**Membership / Unlock 只由服务端判定**;客户端不可信任。
---
## 4. Context → 代码落点
| Context | Go | H5 |
|---|---|---|
| Identity | `internal/service/user` | login / mine |
| Profile | `service/profile` | decode form, mine |
| Discovery | `service/report`, `service/scale` | decode, explore, report |
| Relationship | `service/match` | match |
| Ask | `service/ask` | ask tab |
| Companion | `service/companion` | companion tab |
| Commerce | `service/order`, `membership` | paywall, mine |
包名只用 `domain.md` 词汇:`user` `profile` `report` `order` `membership` `scale` `ask` `mood`
---
## 5. 测测域 → 愈心谷域 映射
| 测测概念 | 愈心谷 |
|---|---|
| 星盘档案 | **Profile**(生日+体质相关输入) |
| 测测 AI | **Ask** |
| 真人 1v1 | **Consult**(后置) |
| MBTI 等 | **Scale** |
| 缘分合盘 | **Match**(合规叙事) |
| 今日运势 | **SolarTerm** + 生活建议(替换) |
| 会员 | **Subscription / Membership** |
| AI 玩法广场 | **[No] MVP** |
| 心情打卡 | **Mood** |
| 沙盘/心情小镇 | **[No]** |
---
## 6. 生成顺序(给 AI
1. 改范围 → 更新 `product/feature-map.md` MVP 标记
2. 新实体 → 本文件 + `domain.md` 词条(若新词)
3. migration → `playbooks/new-table.md`
4. API → `playbooks/add-api.md` + OpenAPI
5. 页面 → `playbooks/new-page.md` + design contract
下一步可选:单独 `apps/docs/erd.md` 或 migrations 初稿(本任务不强制)。
1. GrowthReport 完整字段仅当 Membership active **或** DeepAccess 存在。
2. Ask 必须绑定 `profile_id`Self 或 Other)。
3. RelationInsight 引用两个 Profile;禁止无档案的「合婚」式空算。
4. 客户端不可信任本地「已深度版」标志。
5. 档案表不存吉凶列;**报告 JSON payload 允许**运势分/匹配指数(如 `fortune.daily.score``love_index`)。
+43
View File
@@ -0,0 +1,43 @@
# Entity CatalogWave 0 · 概念级)
> 仅登记名称、归属 BC、Capability、生命周期备注。**不建表、不写 migration。**
> 与 [`glossary.yaml`](glossary.yaml) · [`boundary-rules.md`](boundary-rules.md) 一致。
Status: `Draft`
| Entity | BC | Capability | Notes |
|--------|----|------------|-------|
| AdminAccount | Admin_Auth_Audit | AdminGovernance | 已存在 Ops-A |
| AdminSession | Admin_Auth_Audit | AdminGovernance | 已存在 |
| AuditLog | Admin_Auth_Audit | AdminGovernance | 已存在;只追加 |
| AdminRole | Admin_RBAC | AdminGovernance | **ECR-013A** |
| AdminPermission | Admin_RBAC | AdminGovernance | **ECR-013A** |
| User | Identity_Profile | AccountLifecycle | 已存在 |
| Profile | Identity_Profile | UserIntelligence | 已存在 |
| UserStatus | Identity_Profile | AccountLifecycle | **ECR-013B** 状态机 |
| AccountStateTransition | Identity_Profile | AccountLifecycle | **ECR-013B** |
| BehaviorSnapshot | Identity_Profile | UserIntelligence | **ECR-016** 读模型(analytics 聚合) |
| PsychologicalTagSet | Identity_Profile | UserIntelligence | **ECR-016** 由报告 type 派生 |
| MembershipPlan | Membership_Orders | CommerceEntitlement | **ECR-014 Closed** |
| Entitlement | Membership_Orders | CommerceEntitlement | **ECR-018** 读模型(MembershipDeepAccess |
| RedemptionCode | Membership_Orders | CommerceEntitlement | **ECR-015 Closed** |
| Membership | Membership_Orders | CommerceEntitlement | 已存在 |
| Order | Membership_Orders | CommerceEntitlement | 已存在 |
| DeepAccess | Membership_Orders | CommerceEntitlement | 已存在 |
| Payment | Membership_Orders | CommerceEntitlement | mock;真支付最后 |
| HomeTool | Ops_Content | ExploreConfig | 已存在 Ops-C |
| ScalePublishState | Ops_Content | ExploreConfig | 已存在 |
| AnalyticsSession / Event | Analytics_OpsB | GrowthInsights | 已存在 Ops-B |
| FilterRule | Content_Safety | ContentSafety | **ECR-019** 只读 + evaluate |
| ModerationCase | Content_Safety | ContentSafety | 后置 |
| CrisisEvent / CrisisPolicy | Content_Safety | CrisisCare | **ECR-022** CrisisPolicy 只读;CrisisEvent 后置 |
| SystemPrompt / Knowledge* / ToolDefinition | Ask_Ops | AICoreConfig | **ECR-021** SystemPrompt 只读;Knowledge/Tools 后置 |
| AskSessionView / QualityFeedback | Ask_Ops | AskOperations | **ECR-017** AskSessionView**ECR-020** QualityFeedback |
| Banner / FeedSlot | Ops_CMS_NoUGC | OpsCMS | 后置 |
| UGC* | Community | — | **Forbidden** |
## 状态机(ECR-013B · 契约已开)
`UserStatus`: 见 `.ai/product/feature-spec/ops-account-lifecycle.md`
`deleted` soft-delete **不在 013B**(另开)。
实现轮前:**禁止** migration / DeviceAuth 改动。
+260
View File
@@ -0,0 +1,260 @@
# ERD — P1 Schema(冻结草案)
实现时用 migration 落地;列名可微调但**表/聚合关系不得偏离**。
类型:Postgres。敏感:生日等属 Profile,需可删账号级联。
---
## Tables
### users
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| created_at | timestamptz | |
| status | text | active/deleted |
### device_identities
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| device_key | text unique | Visitor |
| user_id | uuid null FK→users | 升级后绑定 |
### profiles
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK→users | |
| relation | text | self \| other |
| display_name | text | |
| birth_date | date | required P1 |
| birth_time | time null | optional |
| birth_place | text null | optional |
| geo_lat | float null | 附近的人 |
| geo_lng | float null | |
| geo_visible | bool | default false;开启后可被附近列表看到 |
| gender | text null | |
| relation_type | text null | partner/family/friend… when other |
| created_at | timestamptz | |
### synastry_invites
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| token | text unique | 分享路径 `/synastry/invite/:token` |
| host_user_id | uuid FK→users | |
| host_profile_id | uuid FK→profiles | |
| expires_at | timestamptz | |
| guest_user_id | uuid null | |
| guest_profile_id | uuid null | |
| report_id | uuid null FK→growth_reports | accept 后写入 |
| created_at | timestamptz | |
### scales
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| slug | text unique | |
| title | text | 探索测试标题 |
| status | text | published/draft |
### scale_questions
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| scale_id | uuid FK | |
| sort | int | |
| body | jsonb | 题干与选项 |
### scale_results
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK | |
| scale_id | uuid FK | |
| profile_id | uuid FK | |
| answers | jsonb | |
| result | jsonb | 探索结果摘要(可公开字段) |
| created_at | timestamptz | |
### growth_reports
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK | |
| profile_id | uuid FK | |
| type | text | portrait \| relation \| … |
| summary | jsonb | **基础版**,始终可按规则返回 |
| detail | jsonb | **深度版**,服务端按权益剥离 |
| created_at | timestamptz | |
### relation_insights
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK | |
| profile_a_id | uuid FK | usually self |
| profile_b_id | uuid FK | other |
| summary | jsonb | 对比标签等基础 |
| report_id | uuid null FK→growth_reports | 深度建议所在报告 |
| created_at | timestamptz | |
### ask_threads
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK | |
| profile_id | uuid FK | 当前解读对象 |
| created_at | timestamptz | |
### ask_messages
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| thread_id | uuid FK | |
| role | text | user \| assistant |
| content | text | |
| created_at | timestamptz | |
### memberships
| column | type | notes |
|---|---|---|
| user_id | uuid PK FK→users | |
| plan | text | month/quarter/year |
| status | text | active/expired |
| expires_at | timestamptz | |
| ask_quota_left | int | |
### orders
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK | |
| kind | text | membership \| deep_access |
| amount_cents | int | |
| status | text | created/paid/failed |
| created_at | timestamptz | |
### payments
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| order_id | uuid FK | |
| channel | text | mock \| wechat… |
| status | text | |
| raw | jsonb null | |
### deep_accesses
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK | |
| report_id | uuid FK→growth_reports | |
| order_id | uuid FK | |
| created_at | timestamptz | |
### moodsP2 可先建表空用)
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK | |
| day | date | |
| score | int null | |
| note | text null | |
### memory_itemsP3
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| user_id | uuid FK | |
| kind | text | |
| payload | jsonb | |
| created_at | timestamptz | |
### admin_accountsOps-A · ECR-006
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| username | text unique | |
| password_hash | text | bcrypt |
| status | text | active/disabled |
| created_at | timestamptz | |
| updated_at | timestamptz | |
### admin_sessions
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| admin_id | uuid FK→admin_accounts | |
| token | text unique | opaque |
| expires_at | timestamptz | |
| created_at | timestamptz | |
### admin_audit_logs
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| admin_id | uuid FK | |
| action | text | e.g. membership.grant |
| target_type | text | user/order/… |
| target_id | text | |
| meta | jsonb | |
| created_at | timestamptz | 只追加 |
### analytics_sessionsOps-B · ECR-007
| column | type | notes |
|---|---|---|
| session_id | text PK | 客户端 session_id |
| device_key | text | |
| user_id | uuid FK null | |
| started_at | timestamptz | |
| ended_at | timestamptz null | |
| exit_page | text null | |
| duration_ms | int null | |
### analytics_events
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| session_id | text FK→analytics_sessions | |
| user_id | uuid FK null | |
| name | text | page_view / page_leave / … |
| page_path | text null | |
| props | jsonb | 白名单键;无 PII |
| client_ts | timestamptz | |
| received_at | timestamptz | 只追加 |
### home_toolsOps-C · ECR-008
| column | type | notes |
|---|---|---|
| id | uuid PK | |
| row_index | smallint | 1 \| 2 |
| sort_order | int | |
| path | text | 站内相对路径 |
| icon | text | HomeToolIcon 白名单 |
| label | text | ≤16 字 |
| badge | text null | |
| badge_tone | text null | hot \| new |
| enabled | bool | |
| updated_at | timestamptz | |
---
## Relationship sketch
```
users 1──* profiles
users 1──* scale_results
users 1──* growth_reports
users 1──0..1 memberships
users 1──* orders 1──* payments
growth_reports 1──* deep_accesses
profiles ── relation_insights ── profiles
users 1──* ask_threads 1──* ask_messages
admin_accounts 1──* admin_sessions
admin_accounts 1──* admin_audit_logs
users 1──* analytics_sessions 1──* analytics_events
home_tools(运营配置宫格)
scales.status published|draft
```
+116
View File
@@ -0,0 +1,116 @@
# domain glossary — engineering / API unique terms
# Wave 0 Draft. Runtime copy: .ai/domain/glossary.yaml
# User-facing copy stays in .ai/product/lexicon.md
# Conflict: Architect + Human resolve; do not invent synonyms in code.
version: "0.1.0"
status: draft
terms:
AdminRole:
zh: 管理员角色
bc: Admin_RBAC
forbidden: [admin_group, privilege_group]
AdminPermission:
zh: 管理员权限点
bc: Admin_RBAC
forbidden: [acl_flag, authz_bit]
AuditLog:
zh: 操作审计日志
bc: Admin_Auth_Audit
forbidden: [admin_history]
UserStatus:
zh: 用户账户状态
bc: Identity_Profile
values: [active, disabled, banned, suspended]
forbidden: [user_flag, account_level]
AccountStateTransition:
zh: 账户状态迁移
bc: Identity_Profile
forbidden: [status_patch_log]
MembershipPlan:
zh: 会员套餐
bc: Membership_Orders
forbidden: [package, vip_level, 订阅档, sku_vip]
Entitlement:
zh: 权益
bc: Membership_Orders
forbidden: [privilege_pack, benefit_bundle]
RedemptionCode:
zh: 兑换码
bc: Membership_Orders
forbidden: [gift_card, activation_key_alias]
DeepAccess:
zh: 深度版
bc: Membership_Orders
forbidden: [Unlock, unlock_report]
BehaviorSnapshot:
zh: 行为快照
bc: Identity_Profile
forbidden: [user_track_dump]
PsychologicalTagSet:
zh: 心理标签集
bc: Identity_Profile
forbidden: [psy_labels_raw]
FilterRule:
zh: 过滤规则
bc: Content_Safety
forbidden: [badword_only]
ModerationCase:
zh: 审核工单
bc: Content_Safety
forbidden: [review_ticket_ugc]
CrisisEvent:
zh: 危机事件
bc: Content_Safety
forbidden: [suicide_flag_public]
CrisisPolicy:
zh: 危机策略
bc: Content_Safety
forbidden: [kill_switch_generic]
SystemPrompt:
zh: 系统提示词
bc: Ask_Ops
forbidden: [god_prompt]
KnowledgeSource:
zh: 知识源
bc: Ask_Ops
forbidden: [rag_file]
KnowledgeChunk:
zh: 知识块
bc: Ask_Ops
forbidden: [embedding_row_ui]
ToolDefinition:
zh: 工具定义
bc: Ask_Ops
forbidden: [function_call_config_loose]
Banner:
zh: 运营横幅
bc: Ops_CMS_NoUGC
forbidden: [story_feed_ugc]
Community:
zh: (禁止能力)
bc: Community
status: forbidden
forbidden: [ugc_plaza, 社区广场]
+62
View File
@@ -0,0 +1,62 @@
# Environment Policy — AI Contract
项目环境分为三类,**禁止混用配置与工作流**:
| Environment | Goal | Typical tools |
|---|---|---|
| **1. Local Development** | 分钟级反馈、快速改代码 | 本机 Go / Node + Docker **仅依赖服务** |
| **2. CI** | 一致性、可重复验证 | 容器构建、单测、集成测 |
| **3. Production Deployment** | 稳定、不可变交付 | 镜像 + Compose/K8s |
## Principles
1. **Local 优先开发效率** — 改一行代码应秒级/十秒级可见,禁止「每次改代码都 docker build」。
2. **CI 优先一致性** — 用干净环境证明可构建、可测试。
3. **Production 优先稳定性** — 不可变镜像;禁止服务器上 `git pull && go build` 当主路径。
## AI MUST
- 本地写 Go / Vue 时默认 **本机 runtime**(见 [development.md](development.md))。
- Docker 本地用途默认 = **依赖服务**Postgres 等),见 [docker.md](docker.md)。
- 部署相关只改 [deployment.md](deployment.md) / `deploy/*`,不把 prod 流程套到本地编码。
## AI MUST NOT
- 假设「有 Docker = 本地必须 compose 起 api/web」。
- 为改一行业务代码要求 rebuild application image。
-`.env` / 生产密钥写进镜像或提交进库。
- 用 production `APP_ENV` / 生产 `DATABASE_URL` 跑本地热更。
---
## Configuration Ownership
| File | Owner | Committed? |
|---|---|---|
| `deploy/.env.example`(或根 `.env.example`) | 模板:键名 + 无秘密默认值 | **Yes** |
| `.env.local` | 本地覆盖 | **No** |
| `.env.test` / CI secrets | CI 注入或加密变量 | 密钥 **No** |
| `.env.production` / 平台密钥 | 部署系统注入 | **No** |
### Rules
- Code **never** contains environment-specific secret values.
- Local values stay in `.env.local`(已被 `.gitignore``*.local` / `.env` 覆盖)。
- Production values are injected by the deployment system — not copied from a laptop.
- `.env*` files containing secrets must **never** be committed.
- Do not load `.env.production` in local `air` / Vite.
- Prefer one template (`.env.example`);按环境注入,勿把三套真密钥放进仓库。
---
## Freeze
环境层(本文件 + `development.md` + `docker.md` + `deployment.md` + `commands.md` 相关部分)**已冻结**。
除非真实踩坑,否则不再横向扩工程规范;下一投入点 = P1 领域实现(schema / API / 页面)。
## Related
- Local: [development.md](development.md)
- Docker role: [docker.md](docker.md)
- Prod/CI deploy: [deployment.md](deployment.md)
- Commands: [commands.md](commands.md)
+24 -4
View File
@@ -54,19 +54,39 @@ No raw `fetch` in `pages/`.
Rules, ADR, patterns, examples, playbooks, checklists. Not runtime code.
### Environment docs
| Path | Owns |
|---|---|
| `environment.md` | Local vs CI vs Prod policy |
| `development.md` | Host Go / Vite local rules |
| `docker.md` | When Docker is / is not used |
| `deployment.md` | Prod immutable images / CI |
| `commands.md` | Copy-paste commands |
Runtime compose for **deps only**: repo-root `docker-compose.dev.yml`.
### .ai/product/ & .ai/domain/
| Path | Owns |
|---|---|
| `product/feature-map.md` | 愈心谷 L0/L1/L2 + MVP 标记 |
| `product/cece-feature-map.md` | 测测竞品合并 Feature Tree |
| `domain/domain-map.md` | Bounded contexts / aggregates / ER |
| `domain.md` | Ubiquitous terms only |
| `product/lexicon.md` | 产品中文语言契约(最高优先级) |
| `product/feature-design.md` | Feature Spec 强制规范 |
| `product/feature-spec/` | 单功能详细设计(流程/规则/API/验收) |
| `product/user-journey.md` | 转化路径 |
| `product/page-tree.md` | H5 路由冻结 |
| `product/feature-map.md` | 能力树 · 五 Tab 冻结 |
| `product/ENGINEERING-FREEZE.md` | P1 真源索引 |
| `playbooks/feature-spec.md` | Spec → 实现步骤 |
| `domain/domain-map.md` + `erd.md` | Contexts + 表结构 |
| `architecture/go-services.md` | Go 包边界 |
| `domain.md` | Tech ↔ 用户名 |
### .ai/design/
| Path | Owns |
|---|---|
| `reverse-engineering-spec.md` | 竞品/成熟 App 逆向工程规范(STEP 118 · Evidence First |
| `design-system.md` | Tokens, color, type, spacing, motion, voice |
| `component-catalog.md` | Allowed reusable UI components |
| `platform/*.md` | H5 / mini-program / website / Flutter limits |
+10 -1
View File
@@ -19,14 +19,21 @@ AI obeys NEVER rules strictly.
- Never invent response shapes other than `{code,message,data}`.
- Never use POST for pure read/query.
- Never skip migration when schema changes.
- Never hand-apply schema changes on shared/prod DB instead of migrations.
- Never edit already-merged migration files on `main` (fix forward).
- Never hard-delete user PII without explicit task (use soft delete).
## Security / deploy
## Security / deploy / environment
- Never hardcode passwords, tokens, or secrets.
- Never commit `.env` or private keys.
- Never use Docker image tag `latest` in production.
- Never log full birthday + answers payloads casually.
- Never introduce a **Docker-only** local coding workflow for Go/Vue.
- Never require application **image rebuild** after every local code change.
- Never put local secrets into Docker images.
- Never mix local/dev config with production config or prod compose as daily default.
- Never assume `docker compose up` must start api + web for development.
## Product / process
@@ -35,3 +42,5 @@ AI obeys NEVER rules strictly.
- Never modify files outside the current task.
- Never extend Legacy root HTML unless the task is migration.
- Never guess requirements — ASK FIRST.
- Never implement **new feature behavior** or **expand** an existing feature without an Active Feature Spec under `product/feature-spec/`(见 `product/feature-design.md`)。Bugfix 若暴露 Spec 错误必须同步修正 Spec。
- Never treat `feature-map.md` alone as sufficient design input for coding.
+19
View File
@@ -0,0 +1,19 @@
# Playbook: Feature Spec → Implementation
在写任何新功能或重大行为变更前执行。
## Steps
1.`product/feature-map.md` 确认节点与分期(P1/P2/P3/No)。
2. 复制 `product/feature-spec/_TEMPLATE.md``product/feature-spec/<id>.md`
3. 填满 §1–§13;文案过 `lexicon.md`
4.`feature-spec/README.md` 登记索引。
5. 若改数据/API:同步 `domain/erd.md` + `proto/openapi.yaml`(可先草案)。
6.`playbooks/add-api.md` / `new-page.md` / `new-table.md` 实现。
7. 编码中更新 Spec §14 Implementation NotesGaps 标 `Gap:`
8. 对照 Spec §12 + `checklists/feature.md` + DoD 验收。
## Stop
- Spec §4 / §7 / §9 / §12 为空 → 禁止编码。
- 需求不清 → ASK FIRST。
+12 -11
View File
@@ -5,14 +5,15 @@ Use when: “新增页面”
## Steps
1. Confirm IA tab vs secondary page (`.ai/ui.md`)
2. Read `.ai/design/design-system.md` + `component-catalog.md` + `design/platform/h5.md`
3. Reuse catalog components; update catalog if adding a new one
4. Add route in `apps/user-h5/src/router`
5. Add `pages/XxxPage.vue` (PascalCase); tokens only (no raw brand hex)
6. Extract components if file approaches 300400 lines
7. Data via `src/api``@yuxingu/sdk` only
8. Use domain words from `.ai/domain.md`
9. Loading / empty / error states
10. Compliance copy if report-like
11. `npm run build:h5`
12. Review + checklist/feature.md
2. Read `.ai/product/lexicon.md` + `feature-map.md`(文案禁用词)
3. Read `.ai/design/design-system.md` + `component-catalog.md` + `design/platform/h5.md`
4. Reuse catalog components; update catalog if adding a new one
5. Add route in `apps/user-h5/src/router`
6. Add `pages/XxxPage.vue` (PascalCase); tokens only (no raw brand hex)
7. Extract components if file approaches 300400 lines
8. Data via `src/api``@yuxingu/sdk` only
9. Domain terms from `.ai/domain.md`UI 中文从 lexicon
10. Loading / empty / error states
11. Compliance copy if 成长报告-like
12. `npm run build:h5`
13. Review + checklist/feature.md
+36
View File
@@ -0,0 +1,36 @@
# Engineering Freeze — 进入 P1 开发前真源
以下文件为 **P1 冻结输入**;改动需 ADR 或产品确认。
| # | 真源 | 路径 |
|---|---|---|
| 1 | 产品语言 | `product/lexicon.md` |
| 2 | 能力树 + 冻结 IA | `product/feature-map.md` |
| 3 | Feature Spec 规范 | `product/feature-design.md` |
| 4 | 功能详细设计 | `product/feature-spec/` |
| 5 | 用户旅程 | `product/user-journey.md` |
| 6 | H5 页面树 | `product/page-tree.md` |
| 7 | 域词 | `domain.md` |
| 8 | Domain Map | `domain/domain-map.md` |
| 9 | ERD | `domain/erd.md` |
| 10 | API Contract | `proto/openapi.yaml` |
| 11 | Go 服务边界 | `architecture/go-services.md` |
| 12 | Design System | `design/design-system.md` |
环境规范层已冻结(`.ai/environment.md` 等)。
完成闸门:`.ai/definition-of-done.md`(强制)。
状态标签:`.ai/product/p1-status.md`**`P1 Complete`**(必做项收口;P2 另列)。
**P2 三模块(设计已立项,实现另开切片):** 星象性格 · 身心节律 · 意象卡片
→ Spec`feature-spec/star-profile.md` · `life-rhythm.md` · `image-card.md` · 队列见 `feature-spec/P2-BACKLOG.md`
→ 实现前须 Spec Active + OpenAPI/erd**不计入 P1 Complete**。
## Review 清单(合并前必过)
1. 用户可见文本是否仅来自 lexicon?有无旧产品词/玄学预测?
2. 对应 `feature-spec/<id>.md` 是否存在且 §4/§7/§9/§12 非空?
3. 路由是否落在 page-tree
4. Domain / 表名是否符合 domain.md(无 decode/luck 等)?
5. 权益是否只在服务端裁剪?
6. 关系理解是否仍在 P1 路径中(双引擎)?
7. 数据模型是否留有 Memory / Consult 扩展位(不阻塞 P1)?
+23 -10
View File
@@ -1,12 +1,25 @@
# Product docs for AI agents
# Product docsAI 真源)
| File | Audience | Purpose |
|---|---|---|
| [STRATEGY.md](STRATEGY.md) | All agents | **执行优先级**:先测测 parityVision v1 已封存 |
| [feature-map.md](feature-map.md) | PRD / H5 / API | 愈心谷差异化能力树(Design Vision v1 |
| [cece-feature-map.md](cece-feature-map.md) | Competitor / parity | 测测 Feature Tree — 下一版对齐主参考 |
| [../domain/domain-map.md](../domain/domain-map.md) | Backend / DB / OpenAPI | Bounded contexts & entities |
| [../domain.md](../domain.md) | All code | Ubiquitous language (terms only) |
| File | Purpose |
|---|---|
| [ENGINEERING-FREEZE.md](ENGINEERING-FREEZE.md) | **P1 冻结清单** |
| [p1-status.md](p1-status.md) | **P1 完成度(当前:P1 Complete** |
| [p2-status.md](p2-status.md) | **P2 完成度(当前:P2 Complete** |
| [lexicon.md](lexicon.md) | 产品语言契约(最高优先级) |
| [feature-design.md](feature-design.md) | **Feature Spec 强制规范** |
| [feature-spec/](feature-spec/README.md) | **功能详细设计(单功能 HOW** |
| [feature-map.md](feature-map.md) | 能力树 · 五 Tab 冻结(WHAT) |
| [user-journey.md](user-journey.md) | 转化路径(含关系分享引擎) |
| [page-tree.md](page-tree.md) | H5 路由树 |
| [STRATEGY.md](STRATEGY.md) | 参考模型 ≠ 复制品牌 |
| [cece-feature-map.md](cece-feature-map.md) | 竞品对照(勿抄品牌视觉) |
| [../design/reverse-engineering-spec.md](../design/reverse-engineering-spec.md) | **逆向工程设计规范 V1.0**(对标成熟 App 时强制) |
| [feature-spec/cece-frontend-re/](feature-spec/cece-frontend-re/README.md) | **测测前端全量逆向设计文档**(五 Tab + 工具域 + STEP 518 |
| [feature-spec/cece-frontend-re/complete-design/](feature-spec/cece-frontend-re/complete-design/README.md) | **测测对标 · 完整产品设计包(Design Complete**;模拟器校验见包内 99 |
Product narrative docs (human PRD): `apps/docs/`.
**冲突时:** `STRATEGY.md` 的 parity 执行 > Vision v1 创新项
冲突:`lexicon` > `feature-map` 分期 > **`feature-spec`** > `user-journey` / `page-tree` > 历史文档。
对标竞品分析时另加:`design/reverse-engineering-spec.md`(完整性与证据层级)
开发链路:`feature-map` →(对标时)逆向 STEP 1–18 → `feature-spec` → domain/OpenAPI → 实现 → 测试 → Review。
P2 探索收口:[p2-status.md](p2-status.md) · [feature-spec/P2-BACKLOG.md](feature-spec/P2-BACKLOG.md) · 星座 / 身心节律 / 意象卡片。
+29 -20
View File
@@ -1,32 +1,41 @@
# Product Strategy Snapshot
# Product Strategy
## Sealed design (this repo state)
## 原则
Documented vision: **愈心谷差异化** — 数字性格 + 中医体质 + 关系档案 + 节气,学测测飞轮但替换运势主叙事。
| 参考竞品 | 愈心谷自己的 |
|---|---|
| 功能模型 | 品牌语言(见 [lexicon.md](lexicon.md) |
| 用户路径 | 功能命名 |
| 商业模型(测评→档案→AI→会员→咨询) | 叙事:成长 / 认识自己 / 理解他人 |
Canonical docs at seal time:
**不是**竞品品牌复制品。UI/PRD/Ask **禁止**出现:测测(自称)、占卜/算命恐吓、医疗疗效承诺;禁止以「塔罗」作主路径入口名。
- `product/feature-map.md` — 愈心谷能力树(含 MVP 标记)
- `product/cece-feature-map.md` — 测测竞品树
- `domain/domain-map.md` — 领域模型
- `apps/docs/prd-mvp.md` · `business-model.md` · `product-roadmap.md`
- `.ai/design/*` — Design System Contract
**能力与系统可按逆向规范完整对标**:见 [../design/reverse-engineering-spec.md](../design/reverse-engineering-spec.md)Evidence First · STEP 118 · Feature Complete)。
逆向的是功能/业务/数据/运营体系;落地时用愈心谷命名与 lexicon,不照搬竞品商标与独特视觉品牌。
Treat the above as **Design Vision v1(已封存)** — 可对照、可回退,不作为下一迭代的强制做完清单。
**P2 允许同构探索模块**(能力可对标竞品;星座模块允许运势分与匹配指数,须过 lexicon):
| 竞品能力域 | 愈心谷模块(用户名) | Spec |
|---|---|---|
| 星座 | 星座(星盘 · 运势 · 合盘) | `feature-spec/star-profile.md` |
| 命理 | 身心节律 | `feature-spec/life-rhythm.md` |
| 塔罗 | 意象卡片 | `feature-spec/image-card.md` |
星盘/运势可作模块内主文案;品牌 slogan 仍以成长/认识自己为主。须过 lexicon。
封存的差异化长文设计见 git tag `design-vision-v1`(历史参考)。
---
## Next build direction(执行优先
## 执行分期(与 feature-map 对齐
**先出一版和测测结构类似的产品,不要一上来就创新。**
1. **P1** — 档案 · 性格探索/画像 · 人格测评 · 关系理解 · 问答 · 深度版 · 会员 · 分享 · 埋点
2. **P2** — 星象性格 · 身心节律 · 意象卡片 · 节气陪伴深化 · 心情记录 · 成长计划 → **P2 Complete**[p2-status.md](p2-status.md)
3. **P3** — 长期记忆 · 成长数据库 · 真人顾问
| 原则 | 含义 |
|---|---|
| IA 对齐测测 | 首页发现 · 问(AI)· 在线/咨询位 · 消息或可后置 · 我的 |
| 能力对齐测测漏斗 | 测评拉新 → 档案 → AI 问 → 会员 → 咨询占位 |
| 叙事可先「泛心理 + 星座/性格」 | 体质/节气差异化后置,不阻塞首版 |
| 不做冷启动重资产 | 不做达人双边冷启动、不做硬件、不做 UGC 玩法广场首版 |
真支付仍属部署阶段,不进入 P1/P2 Complete 判定。
差异化 Vision v1 在首版跑通测测式漏斗后再渐进引入(Decode 体质、节气陪伴等)
冲突时:**lexicon + feature-map > 历史 Vision 文档中的旧命名(解码/Unlock 等)**
执行时以即将撰写的 **Cece-parity PRD / feature-map-v0** 为准;冲突时:**parity 执行 > Vision v1 创新项**。
工程冻结清单:[ENGINEERING-FREEZE.md](ENGINEERING-FREEZE.md)。
P1 双引擎:个人画像 **与** 关系理解,不可只做「我是谁」。
+3 -1
View File
@@ -11,7 +11,9 @@
| L1 Capability | 系统背后有哪些能力域 | §2 挂在各入口下 / §3 横切 |
| 演进 | 工具 → AI 顾问 → Life OS | §4 |
愈心谷落地地图见 [feature-map.md](feature-map.md)。领域实体见 [../domain/domain-map.md](../domain/domain-map.md)。
愈心谷落地地图见 [feature-map.md](feature-map.md)。领域实体见 [../domain/domain-map.md](../domain/domain-map.md)。
对单页/单能力做完整逆向时,强制遵循 [../design/reverse-engineering-spec.md](../design/reverse-engineering-spec.md)Evidence First · STEP 118)。
**前端全量逆向设计套件(详细):** [feature-spec/cece-frontend-re/](feature-spec/cece-frontend-re/README.md) · **完整设计包:** [feature-spec/cece-frontend-re/complete-design/](feature-spec/cece-frontend-re/complete-design/README.md)
---
+118
View File
@@ -0,0 +1,118 @@
# Feature Design Standard
**任何新功能或重大行为变更,开发前必须存在对应 Feature Specification。**
Feature Spec 是产品、设计、开发的**唯一功能输入**。
`feature-map.md` 只回答「做什么 / 在哪棵树上」——**不够**开始编码。
完整链路:
```
feature-map(能力树)
→ feature-spec(功能详细设计)
→ domain / OpenAPI / erd(技术契约)
→ implementation
→ test
→ review
```
规范位置:本文件。
Spec 目录:[`feature-spec/`](feature-spec/README.md)。
模板:[`feature-spec/_TEMPLATE.md`](feature-spec/_TEMPLATE.md)。
对标成熟 App[`../design/reverse-engineering-spec.md`](../design/reverse-engineering-spec.md)(逆向 STEP 118 · Evidence First)。
---
## 禁止
- 根据一句需求直接编码
- 根据页面截图或竞品 UI **跳步猜测**业务规则(须走逆向规范并标注证据)
- 未定义 User Flow / 页面状态 / Business Rules 就开发
- 仅有页面或 API「能跑」就称 Feature Complete
- Spec 未更新就扩大已有功能行为(bugfix 除外)
- 在 Spec 中偷偷扩大 `feature-map` 分期范围(P2 写成 P1
- 对标竞品时输出 Demo/MVP 式省略(「略」「TODO」「以后再做」)作为 Spec 终态
---
## 允许的例外
| 场景 | 要求 |
|---|---|
| 明确 bugfix(行为已在 Spec/OpenAPI 定义) | 可直接修;若暴露 Spec 错误则同步修正 Spec |
| 文案/lexicon 微调且不改规则 | 可改代码 + lexicon;不强制新 Spec |
| 纯重构(对外行为不变) | 不强制新 Spec;DoD 仍适用 |
| 存量功能尚无 Spec | **进入该功能开发前必须先 retrofit Spec**;否则只许修明确 bug,不得扩行为 |
---
## 冲突优先级
1. `lexicon.md`(用户可见中文)
2. `feature-map.md` 分期与边界标记
3. **本功能的 `feature-spec/<id>.md`**(流程、规则、验收)
4. `user-journey.md` / `page-tree.md`
5. `domain/` + OpenAPI(实现契约;必须与 Spec §8/§9 对齐)
6. 历史 PRD / `apps/docs/*` / 立项文档
Spec 文案不得违反 lexicon。Spec 不得把 `[P2]`/`[No]` 能力写成已交付。
---
## Feature Spec 强制章节
每份 Spec 必须包含(可用 N/A + 原因,不可省略标题):
| # | 章节 | 要求 |
|---|---|---|
| 1 | 功能定义 | Name / Purpose / Business Goal |
| 2 | 用户价值 | 为何需要 / 完成后获得什么 / 为何付费 |
| 3 | 用户角色 | Guest / User / VIP(对齐实际 Identity 模型) |
| 4 | 用户流程 | ASCII 或 mermaid;含分支 |
| 5 | 页面设计 | 路由 + 页面列表;对照 page-tree |
| 6 | 页面状态 | Loading / Empty / Error / Normal / Locked(适用则写) |
| 7 | Business Rules | 编号 Rule N**权益由 Server 判断** |
| 8 | 数据模型影响 | 表/字段;指向 erd,禁止臆造 |
| 9 | API 需求 | 路径级意图;细节以 OpenAPI 为准并须同步 |
| 10 | 权限设计 | 角色 × 能力矩阵 |
| 11 | 埋点 | 事件名;未接 SDK 也先定义 |
| 12 | 测试验收标准 | Given / When / Then |
| 13 | AI 开发前检查 | checkbox |
| 14 | Implementation Notes | 编码时填写:包、迁移、与现状 gap |
User Flow 与验收故事**写在 Spec 内**,不另建平行 `user-story/` 真相源。
---
## AI 开发前检查(强制)
Before implementation, AI MUST verify:
- [ ] Feature Spec 文件存在(`feature-spec/<id>.md`
- [ ] 已在 `feature-map.md` 挂树且分期正确
- [ ] User Flow(§4)已定义
- [ ] Business Rules(§7)已定义
- [ ] API 需求(§9)已定义,并计划更新 OpenAPI
- [ ] 数据影响(§8)已核对 erd
- [ ] 页面状态(§6)已定义
- [ ] Acceptance(§12)已定义
- [ ] 文案符合 `lexicon.md`
任一项缺失 → **停止编码,先补 Spec 或 ASK**
---
## 何时更新 Spec
- 新功能:先复制 `_TEMPLATE.md` → 填满 → 再编码
- 改规则 / 改权益 / 改主流程 / 改付费墙:先改 Spec,再改代码
- 仅修 bug:若 Spec 与现实不符,修完后回写 Spec
Playbook[`../playbooks/feature-spec.md`](../playbooks/feature-spec.md)
---
## 与 DoD 的关系
无适用 Feature Spec → **不得**勾选 Feature Complete(见 `definition-of-done.md` §1)。
「OpenAPI 有了 / 页面打开了」而 Spec 缺失 = 伪完成。
+255 -187
View File
@@ -1,212 +1,280 @@
# 愈心谷 — Product Feature Map
**权威产品能力树**(PRD / 路由 / 竖切范围以此为准
竞品原文树:[cece-feature-map.md](cece-feature-map.md)
领域实体:[../domain/domain-map.md](../domain/domain-map.md)
词汇[../domain.md](../domain.md) · PRD`apps/docs/prd-mvp.md`
**权威产品能力树WHAT)。** 语言以 [lexicon.md](lexicon.md) 为准。
单功能详细设计(HOW):[feature-design.md](feature-design.md) · [feature-spec/](feature-spec/README.md)
参考测测的是:**功能模型 · 用户路径 · 商业模型**;品牌叙事与命名必须是愈心谷自己的。
领域实体[../domain/domain-map.md](../domain/domain-map.md) · 词汇:[../domain.md](../domain.md)
竞品对照(可含竞品原名):[cece-feature-map.md](cece-feature-map.md)
策略:[STRATEGY.md](STRATEGY.md)
标记:`[MVP]` `[V1]` `[Later]` `[No]`
标记:`[P1]` 第一阶段 · `[P2]` 第二阶段 · `[P3]` 第三阶段 · `[No]`
**编码前**必须打开对应 Feature Spec;仅有本文件不够。
---
## L0 — App 信息架构
## 定位
愈心谷 = 通过数字性格、身心特征、关系理解与 AI 陪伴,帮助用户更好地认识自己、理解他人的个人成长平台。
### 核心飞轮
```
探索自己 → 建立个人档案 → 获得个性化分析
→ AI 持续陪伴 → 会员深入体验 → 长期成长记录
```
---
## L0 信息架构(冻结)
```
愈心谷
├── 首页 HomeWash:品牌 + Decode + Feed
├── 探索 Scale / Decode / 轻工具
├── 问 Ask(战略中心 Tab
├── 陪伴 SolarTerm + Mood
── 我的 Life Profile 资产
├── 增长运营(横切)
└── 平台生态(横切 · 后置)
├── 首页 发现与入口中心
├── 探索 核心功能中心
├── 问 AI 成长助手(战略中心 Tab
├── 陪伴 日常留存
── 我的 档案 / 成长报告 / 成长会员
```
路径:`发现 → 建档/测评 → 问/陪伴留存 → 会员·解锁 →(后)Consult`
**五 Tab 名称与顺序冻结,未经 ADR 不得改。**
路径见 [user-journey.md](user-journey.md)。
P1 双引擎:**个人画像 + 关系理解**(不可弱化关系侧)。
---
## L1 — 产品能力树(合并 IA × Domain
## 1. 首页(发现与入口中心
```
愈心谷 Feature Tree
├── 1. Identity & 生命档案
├── 2. Self Discovery(自我探索)
├── 3. Relationship(关系)
├── 4. AI Companion(问)
├── 5. Companion Rhythm(陪伴节奏)
├── 6. Human Expert(真人 · 后置)
├── 7. Content & Feed
├── 8. Growth
├── 9. Commerce
└── 10. Data & Recommendation(平台能力)
```
详见 Spec[feature-spec/home.md](feature-spec/home.md)
### 1.1 创建个人档案 `[P1]`
详见 Spec[feature-spec/profile.md](feature-spec/profile.md)
| 三级 | 内容 |
|---|---|
| 1.1.1 我的信息 | 出生日期;出生时间/地点(可后置);性别 |
| 1.1.2 关系对象 | 伴侣 · 家人 · 朋友 |
| 1.1.3 档案管理 | 编辑 · 删除 · 切换 |
### 1.2 快捷功能入口(九宫格)
性格探索 · 人格测试 · 关系分析 · 个人画像 · AI问答 · 身心探索 · 节气陪伴 · 会员中心 · 更多
(身心探索 / 节气:`[P1]` 可轻入口,深做在 `[P2]`
### 1.3 推荐内容 `[P1]` 静态/运营即可
今日推荐 · 热门探索 · 成长文章 · 用户故事 · 精选成长报告
---
### 1. Identity & 生命档案
## 2. 探索(核心功能中心)
| 二级 | 三级 | 范围 |
### 2.1 性格探索 `[P1]`
帮助用户了解行为模式。详见:[feature-spec/portrait.md](feature-spec/portrait.md) · [reports.md](feature-spec/reports.md)
| 三级 | 内容 |
|---|---|
| 2.1.1 性格测试 | 人格类型 · 行为偏好 · 思维方式 |
| 2.1.2 成长报告 | 免费:基础画像;会员/深度版:完整分析 |
| 2.1.3 分享卡片 | 关键词 · 性格标签 |
### 2.2 人格测评 `[P1]`
MBTI 类 · 沟通方式 · 情感模式 · 成长倾向(首版 ≥1 个热门)
详见 Spec[feature-spec/explore-test.md](feature-spec/explore-test.md)
### 2.3 个人画像(成长画像) `[P1]`
替代竞品「星盘档案」叙事。内容:性格特点 · 兴趣倾向 · 行为模式 · 关系特点 · 生活建议
详见 Spec[feature-spec/portrait.md](feature-spec/portrait.md)
### 2.4 关系理解 `[P1 · 双引擎之一,不可砍]`
详见 Spec[feature-spec/relation.md](feature-spec/relation.md)
| 三级 | 内容 |
|---|---|
| 2.4.1 创建关系 | 添加 TA |
| 2.4.2 双人分析 | 了解双方差异(沟通/行为标签对比) |
| 2.4.3 相处建议 | 沟通方式 · 互动模式 · 关系维护(深度版) |
| 2.4.4 分享卡 | 「我的方式 vs TA 的方式 → 查看关系理解」 |
禁止宿命/恐吓文案。增长价值不低于个人画像。
### 2.5 身心探索 `[P2]`(差异化)
产品化主入口见 **2.7 身心节律**(避免双树)。轻入口可保留在首页/探索。
| 三级 | 内容 |
|---|---|
| 2.5.1 体质倾向 | 了解身体特点 |
| 2.5.2 生活习惯建议 | 饮食 · 作息 · 运动 |
| 2.5.3 节气提醒 | 季节变化 · 生活调整 |
禁止:治疗、改善疾病、疗效承诺。
### 2.6 星座 `[P2]`
详见 Spec[feature-spec/star-profile.md](feature-spec/star-profile.md)
对标竞品「星座」能力:本命星盘 · 行星 · 日/周/月/年运 · 恋爱/友情/婚姻匹配指数。
UI 名:星座。允许运势分与合盘指数;禁止占卜、算命恐吓。
### 2.7 身心节律 `[P2]`
详见 Spec[feature-spec/life-rhythm.md](feature-spec/life-rhythm.md)
对标竞品「命理」能力之生活向:**五行/体质倾向 + 生活建议**。
= §2.5 的产品化主入口。禁止流年吉凶、改命、疗效承诺。
### 2.8 意象卡片 `[P2]`
详见 Spec[feature-spec/image-card.md](feature-spec/image-card.md)
对标竞品「塔罗」能力:**投射反思卡片**。
UI **不出现「塔罗」**。禁止神谕吉凶、恐吓话术。
---
## 3. 问答(AI 核心)
详见 Spec[feature-spec/ask.md](feature-spec/ask.md)
### 3.1 AI 成长助手 `[P1]`
定位:了解你的智能伙伴。不是占卜,不是预测。
| 三级 | 内容 |
|---|---|
| 3.1.1 自我提问 | 性格 · 关系 · 成长 |
| 3.1.2 档案关联回答 | 结合个人档案与探索结果 |
| 3.1.3 深度分析 | 会员 / 深度版 |
### 3.2 AI 场景入口 `[P1]`
认识自己 · 理解关系 · 职业探索 · 情绪整理 · 生活建议
顶栏:切换「我的档案 / TA 的档案」。可并列「顾问预约」占位(履约 `[P3]`)。
---
## 4. 陪伴(日常留存)`[P2]` 主做;`[P1]` 可占位壳
详见 Spec[feature-spec/companion.md](feature-spec/companion.md)
### 4.1 今日状态
心情记录 · 今日感受 · 成长记录
### 4.2 节气生活
今日节气 · 季节变化 · 日常建议(生活建议,非运势)
---
## 5. 我的(个人中心)`[P1]`
| 二级 | 内容 |
|---|---|
| 5.1 我的档案 | 个人资料 · 探索记录 · 关系记录 → [profile.md](feature-spec/profile.md) |
| 5.2 我的成长报告 | 已完成探索 · 已购深度版 · 收藏 → [reports.md](feature-spec/reports.md) |
| 5.3 会员中心 | 完整分析 · 高级成长报告 · AI 更多次数 · 专属内容 → [membership.md](feature-spec/membership.md) |
分享裂变:[feature-spec/share.md](feature-spec/share.md)
---
## 6. 商业体系(模型参考成熟产品,话术用愈心谷)
详见 Spec[feature-spec/membership.md](feature-spec/membership.md)
### 6.1 深度版成长报告 `[P1]`
- 免费:基础结果 / 基础画像
- 付费:完整分析 · 行为模式 · 关系建议 · 成长方向
### 6.2 会员订阅 `[P1]`
月会员 · 季度会员 · 年度会员(支付可先 mock)
### 6.3 `[No]` 首版
干扰广告 · **以「塔罗」命名的商城主路径** · 达人双边冷启动 · 硬件
(意象卡片属探索模块 `[P2]`,不是塔罗商城。)
---
## 分期范围
### 第一阶段 `[P1]` — 必须
用户档案 · 性格探索 · 个人画像 · 关系理解 · AI 问答 · 成长报告深度版 · 会员系统
**不含** 2.62.8P2 三模块不计入 P1 Complete。
### 第二阶段 `[P2]` — **P2 Complete**
星象性格 · 身心节律 · 意象卡片 · 节气陪伴深化 · 心情记录 · 成长计划 · 探索三级目录 · 量表矩阵
状态真源:[p2-status.md](p2-status.md) · Spec`feature-spec/star-profile.md` · `life-rhythm.md` · `image-card.md` · [P2-BACKLOG.md](feature-spec/P2-BACKLOG.md)
排除不变:消息/达人/UGC 广场/运势 Feed;真支付部署阶段再做。
### 第三阶段 `[P3]`
长期 AI 记忆 · 个人成长数据库 · 真人咨询 · 专家服务
---
## 7. 运营后台(内部 · 非 C 端 Tab)
详见 Spec[feature-spec/ops-admin.md](feature-spec/ops-admin.md) · ECR-006
**演进规范(Wave 0):** [`docs/WAVE0/`](../../docs/WAVE0/) · Capability Map · boundary-rules · Contract-First(禁止 Feature 堆砌进实现)
| 分期 | 内容 |
|---|---|
| Phase A `[Ops]` | 登录 · 用户/订单查询 · 会员授予 · 审计 · `apps/admin-h5`ECR-006 Closed |
| Phase B `[Ops]` | 行为分析:自有埋点 + 管理端「数据」看板(**ECR-007** · Spec `ops-analytics.md` |
| Phase C `[Ops]` | 内容:首页宫格 CRUD · 测评上下架(**ECR-008** · Spec `ops-content.md` |
| Phase D `[Ops]` | 商业加深:订单筛选 · 展示价 · 退款只读(**ECR-009** · Spec `ops-commerce.md` |
| Phase E `[Ops]` | 系统:RBAC · 封禁 · 推送占位(**ECR-010** · Spec `ops-system.md` |
| Phase D+ Contract | **Contract-First** 扩展目录:**ECR-013A…040**RBAC/兑换码/问答运营/安全/危机/CMS/ExploreConfig 等)。见 `docs/WAVE0/` |
| Phase F+ / Write-Wave | **写面加深**(首刀 **ECR-041 Banner** · `docs/WAVE0/WRITE_WAVE_AUTHORIZATION.md`);封禁细策略 · 真推送;**UGC 仍 `[No]`****真支付最后** |
不计入 P1 Complete;不进入五 Tab。
---
## L2 路由(冻结 · user-h5
| 路径 | 页面 | 说明 |
|---|---|---|
| 1.1 注册登录 | 手机 / 微信 / 游客 device / 升级 User | [MVP] 游客+升级;微信 [V1] |
| 1.2 Self Profile | 生日(必填);时辰/地点(可选后置) | [MVP] 生日 |
| 1.3 Other Profile | 伴侣/家人/朋友等关系对象 | [MVP] 基础 Other |
| 1.4 档案管理 | 编辑 · 删除 · 多档案切换 · Ask 关联 | [MVP] |
| 1.5 兴趣标签 | 性格/关系/养生等(非运势标签) | [V1] |
| 1.6 行为资产 | 浏览 · Decode · Scale · Ask · Order 记录 | [MVP] 服务端最小集 |
| `/` | 首页 | 发现入口 |
| `/explore` | 探索 | 探索测试列表等 |
| `/ask` | 问答 | AI成长助手 |
| `/companion` | 陪伴 | 节气/心情 |
| `/mine` | 我的 | 资产总览 |
| `/profile` | 个人档案 | 创建/编辑/切换 Self·Other |
| `/portrait` | 个人画像 | 性格探索结果 |
| `/relation` | 关系理解 | 双人分析 |
| `/membership` | 成长会员 | 套餐与权益 |
| `/scales/:slug` | 探索测试作答 | |
| `/reports` | 成长报告列表 | |
| `/reports/:id` | 成长报告详情 | |
| `/star` | 星座 | P2 Complete |
| `/synastry` | 合盘 | P2 Complete |
| `/synastry/invite/:token` | 合盘邀请 | P2 Complete |
| `/rhythm` | 身心节律 | P2 Complete |
| `/cards` | 意象卡片 | P2 Complete |
**[No]** 出生地理风水必填、吉凶标签画像
兼容重定向:`/decode``/portrait`(仅技术兼容,UI 不出现 decode 文案)
---
### 2. Self Discovery(获客工具层
## 护城河(愈心谷
| 二级 | 三级 | 范围 |
|---|---|---|
| 2.1 Decode | 数字性格 + 体质倾向;简版结论 / 完整原因+方案 | **[MVP] 核心** |
| 2.2 Scale 性格 | MBTI 等热门量表 · 结果页 · 分享 | [MVP] ≥1 热门 |
| 2.3 Scale 情感/心理 | 恋爱人格、情绪压力等 | [V1] |
| 2.4 趣味 Scale | 轻传播向 | [V1] 克制 |
| 2.5 五行/八卦轻解读 | 挂在 Decode 或探索,非运势主叙事 | [V1] |
| 2.6 中医体质系统 | 体质倾向 · 生活建议 · 节气联动 | [MVP] 在 Decode 内;深化 [V1] |
**[No]** 塔罗默认入口、紫微/抽签主路径、今日运势主 Feed。
**[Later]** 易经决策系统(合规评审后)。
---
### 3. Relationship
| 二级 | 三级 | 范围 |
|---|---|---|
| 3.1 Match | 双人契合分预览 · 解读锁定 | [MVP] |
| 3.2 相处建议 | 基于性格×体质,非合婚吉凶 | [MVP] 简版;[V1] 完整 |
| 3.3 关系管理 | 重要日期、关系笔记 | [Later] |
**[No]** 八字合婚吉凶、缘分指数恐吓文案。
---
### 4. AI Companion(问 = AI Life Assistant
| 二级 | 三级 | 范围 |
|---|---|---|
| 4.1 Ask 对话 | 性格 / 关系 / 养生路径引导;非运势默认 | [MVP] 规则模板或薄 LLM |
| 4.2 上下文 | 当前 ProfileSelf/Other)挂载 | **[MVP]** |
| 4.3 视角切换 | Ask 顶栏显式切换档案 | [MVP] |
| 4.4 结构化回答 | 短答 · 要点 · 免责声明 | [MVP] |
| 4.5 长期记忆 | 跨会话情绪/事件记忆 | [V1+] |
| 4.6 报告生成 | 从 Ask/Decode 生成可 Unlock Report | [V1] |
| 4.7 双轨入口 | Ask ‖ Consult 占位切换 | [MVP] 占位;履约 [Later] |
**[No]** 多智能体并列品牌(灵犀/小智式)、算命引导语、AI 心情小镇级 3D。
人格模式(产品语义,非多 App):陪伴模式 / 解读模式 — [V1]。
---
### 5. Companion Rhythm(陪伴 Tab
| 二级 | 三级 | 范围 |
|---|---|---|
| 5.1 SolarTerm | 今日节气 · 生活方式建议 | [MVP] 可静态 |
| 5.2 Mood | 打卡 · 简史 | [MVP] 最小写 |
| 5.3 情绪分析/练习 | 安抚话术、放松练习 | [V1] |
| 5.4 成长计划 | 目标 · 打卡 · 成长报告 | [Later] |
**[No]** 运势日历作为陪伴主轴。
---
### 6. Human ExpertConsult
| 二级 | 三级 | 范围 |
|---|---|---|
| 6.1 顾问类型 | 养生顾问 / 关系顾问(合规资质) | [Later] |
| 6.2 流程 | 列表 · 预约 · 支付 · 会话 · 评价 | [Later] |
| 6.3 Marketplace | 达人入驻 · 分佣 | [Later] 非冷启动优先 |
**[MVP]** 仅「顾问预约」表单占位,不履约。
---
### 7. Content & Feed
| 二级 | 三级 | 范围 |
|---|---|---|
| 7.1 首页 Feed | 官方卡片:热门 Scale、Decode、节气 | [MVP] 运营配置/静态 |
| 7.2 文章 | 性格 / 关系 / 养生知识 | [V1] |
| 7.3 社区 UGC | 发帖赞评关注 | **[No] MVP**[Later] 审慎 |
| 7.4 AI 玩法广场 | UGC Prompt 集市 | **[No] MVP**[Later] |
---
### 8. Growth
| 二级 | 三级 | 范围 |
|---|---|---|
| 8.1 分享卡 | Decode / ScaleResult / Match 预览 | [MVP] |
| 8.2 裂变 | 分享 → 建档 → 再测 | [V1] |
| 8.3 激励 | 签到积分勋章 | [Later] |
| 8.4 SEO/内容获客 | Web 落地 | [Later] website |
**[No]** 干扰广告、虚假紧迫倒计时。
---
### 9. Commerce
| 二级 | 三级 | 范围 |
|---|---|---|
| 9.1 Subscription | 月/季/年 | [MVP] mock 支付 |
| 9.2 Membership 权益 | 完整 Decode、Ask 次数、深度节气等 | [MVP] |
| 9.3 Unlock | 单次报告 / Match 解读 | [MVP] |
| 9.4 Order / Payment | 下单 · pay-mock ·(真支付) | [MVP] mock;真支付 [V1] |
| 9.5 课程/商城 | — | [Later] / 低优 |
---
### 10. Data & Recommendation(平台)
| 二级 | 三级 | 范围 |
|---|---|---|
| 10.1 用户数据 | 行为 · Mood · Scale · Ask(最小化、可删) | [MVP] 基础 |
| 10.2 推荐 | Feed / Scale 推荐 | [V1] 规则即可 |
| 10.3 专家/商品推荐 | — | [Later] |
---
## L2 — 页面 / 路由映射(user-h5)
| L0 | 路由建议 | 主要能力 |
|---|---|---|
| 首页 | `/` | Decode 入口、Feed |
| 探索 | `/explore` | Scale 列表、工具 |
| 问 | `/ask` | Ask + Consult 占位 |
| 陪伴 | `/companion` | SolarTerm、Mood |
| 我的 | `/mine` | Profiles、Membership、Orders |
| 二级 | `/decode` `/scales/:slug` `/match` `/report/:id` | Discovery / Relationship / Commerce |
实现约束:`.ai/design/*` · playbook `new-page` / `add-api`
---
## 护城河优先级(愈心谷)
| 梯队 | 能力 | 说明 |
|---|---|---|
| ★★★★★ | 生命档案 Profile · Ask 挂档案 · Relationship Match · Decode(性格×体质) | Memory + 差异化叙事 |
| ★★★★ | Scale · SolarTerm/Mood · Membership/Unlock | 获客与留存与变现 |
| ★★ | Feed 运营 · 分享裂变 | 增长 |
| ★ / No | UGC 广场 · 达人市场 · 硬件 · 塔罗主路径 | 明确后置或不做 |
---
## 竖切顺序(与 roadmap 对齐)
1. **Phase A** — Identity + Decode + Commerce mock
2. **Phase B** — Scale + Match + Share
3. **Phase C** — Ask 骨架 + Companion
4. **Phase D** — 真支付 · 小程序 · Consult 试点
详见 `apps/docs/product-roadmap.md`
| 梯队 | 能力 |
|---|---|
| ★★★★★ | 个人档案 · 问答挂档案 · 关系理解 · 个人画像(性格×身心) |
| ★★★★ | 人格测评 · 会员/深度版 · 陪伴节奏 |
| ★★ | 推荐 Feed · 分享裂变 |
| 后置/不做 | UGC 玩法广场 · 达人市场冷启动 · 塔罗主路径 · 运势主 Feed |
@@ -0,0 +1,236 @@
# P1 全功能流程走查(Feature Spec Layer
**日期:** 2026-08-02
**目的:** 按新链路对 P1 全部功能过一遍——**只做设计与对齐审计,本文件不授权直接开新编码**。
**链路:**
```
feature-map → feature-spec → OpenAPI/erd → implementation → test → review
```
规范:[../feature-design.md](../feature-design.md) · 索引:[README.md](README.md)
图例:
| 标记 | 含义 |
|---|---|
| PASS | 本关已满足,可进入下一关或维持 |
| PARTIAL | 主路径可用,有明确 Gap(见各 Spec §14 |
| SHELL | 有意占位(如陪伴 P1) |
| BLOCK | 缺 Spec/契约,禁止扩行为 |
| N/A | 本关不适用 |
编码优先级:
1. ~~P0 横切:埋点最小集~~**切片 A 已完成**(见 [analytics.md](analytics.md)
2. P1 体验 Gap:探索测试中断恢复
3. P2 探索三模块:见 [P2-BACKLOG.md](P2-BACKLOG.md)(星象性格 → 身心节律 → 意象卡片)
4. 真支付、短链分享、陪伴心情 UI(各改对应 Spec)
其余 Spec §11 事件:后续迭代再挂,勿一次铺满。
---
## 总表
| # | 功能 | Spec | map | OpenAPI/erd | 实现 | 测试 | DoD 标签建议 | 下一步(设计侧已闭合?) |
|---|---|---|---|---|---|---|---|---|
| 1 | 首页 | [home](home.md) | PASS | N/A(复用 profiles | PASS | PARTIAL | Feature Complete(体验) | 埋点;可选推荐位 |
| 2 | 个人档案 | [profile](profile.md) | PASS | PASS | PASS | PARTIAL | Feature Complete | 软删策略写清;埋点 |
| 3 | 个人画像 | [portrait](portrait.md) | PASS | PASS | PASS | PASS | Feature Complete | 埋点;内容已多维 |
| 4 | 关系理解 | [relation](relation.md) | PASS | PASS | PASS | PASS | Feature Complete | 埋点 |
| 5 | 探索测试 | [explore-test](explore-test.md) | PASS | PASS | PASS | PARTIAL | Feature Complete Gap | **设计已标**中断恢复 Gap |
| 6 | AI 问答 | [ask](ask.md) | PASS | PASS | PASS | PASS | Feature Complete | 埋点;真 LLM 依赖配置 |
| 7 | 会员/深度版 | [membership](membership.md) | PASS | PASS | PASS | PASS | Feature Completemock | 真支付另开 Spec 修订 |
| 8 | 成长报告 | [reports](reports.md) | PASS | PASS | PASS | PARTIAL | Feature Complete | 收藏/PDF = Gap |
| 9 | 分享卡 | [share](share.md) | PASS | N/A(前端载荷) | PASS | PARTIAL | Feature Complete Gap | 短链 = Gap |
| 10 | 陪伴 | [companion](companion.md) | PASS | PARTIAL | SHELL | N/A 深测 | **Shell only** | 禁止当 P1 Complete |
**横切:** 埋点最小集已实现(analytics)· 真支付仍为 mockP1 接受)· Visitor 模型与 Spec 一致。
**收口标签:** 见 [p1-status.md](../p1-status.md) → **P1 Complete**
---
## 逐功能走查(六步)
每步问题:① Spec 是否 Active 且 §4/7/9/12 非空?② map/page-tree 对齐?③ OpenAPI/erd?④ 实现是否覆盖主路径与四态?⑤ 测试是否覆盖 §12?⑥ Review/Gaps 是否写入 §14
---
### 1. 首页 · home
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | Purpose/Flow/Rules 齐全 |
| map / page-tree | PASS | `/` |
| 契约 | N/A | 无专用 API |
| 实现 | PASS | 生日 CTA → portrait;快捷入口;无 API 状态墙 |
| 测试 | PARTIAL | 缺独立 Home e2e;主路径被 portrait e2e 间接覆盖 |
| Review | PASS | Gap:埋点、推荐 Feed 静态 |
**流程结论:** 设计闭合。编码仅在做埋点/推荐时先改 Spec §11/§5。
---
### 2. 个人档案 · profile
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | |
| map / page-tree | PASS | `/profile` · `/mine` 入口 |
| 契约 | PASS | GET/POST/PATCH/DELETE profiles |
| 实现 | PASS | 列表/编辑/删除/加 TA |
| 测试 | PARTIAL | L2 有 profile 更新删除流 |
| Review | PASS | Gapbirth_time/place UI;删除级联说明 |
**流程结论:** 设计闭合。扩字段前先改 Spec §8 + erd。
---
### 3. 个人画像 · portrait
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | 含多维报告结构附录 |
| map / page-tree | PASS | `/portrait` |
| 契约 | PASS | POST portrait · GET report · orders |
| 实现 | PASS | 引擎多维 + ReportRich + DeepAccess |
| 测试 | PASS | engine L1 · 集成 deep_access · PortraitPage.spec |
| Review | PASS | Gap:埋点;真支付 |
**流程结论:** 设计闭合。内容结构变更必须先改 Spec 附录再改 `internal/portrait`
---
### 4. 关系理解 · relation
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | 双引擎、禁用合盘 |
| map / page-tree | PASS | `/relation` |
| 契约 | PASS | POST insight |
| 实现 | PASS | 多维对比 + 深度 sections |
| 测试 | PASS | engine L1 · 集成 · RelationPage.spec |
| Review | PASS | Gap:埋点 |
**流程结论:** 设计闭合。
---
### 5. 探索测试 · explore-test
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | 子能力表已展开 |
| map / page-tree | PASS | `/explore` `/scales/:slug` |
| 契约 | PASS | scales list/detail/result |
| 实现 | PASS | 两套 seed;丰富 result;无结果付费墙(Spec 已声明) |
| 测试 | PARTIAL | score/result L1;缺完整答题 e2e |
| Review | PASS | **Gap(已设计):** 答题中断恢复;埋点;若上锁结果须先改 Spec |
**流程结论:** 设计闭合;中断恢复属已登记 Gap,开工前在 Spec §4/§7 补规则细节即可编码。
---
### 6. AI 问答 · ask
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | 配额、降级、挂档案 |
| map / page-tree | PASS | `/ask` |
| 契约 | PASS | quota/threads/messages |
| 实现 | PASS | DeepSeek + 规则降级;四态较全 |
| 测试 | PASS | reply L1 · 集成 thread |
| Review | PASS | Gap:埋点;长期记忆 P3 |
**流程结论:** 设计闭合。改配额数字或 system prompt 结构 → 先改 Spec §7/§14。
---
### 7. 深度版 / 成长会员 · membership
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | DeepAccess Membership |
| map / page-tree | PASS | `/membership` + 报告内墙 |
| 契约 | PASS | membership/me · orders · pay-mock |
| 实现 | PASS | mock 支付落库;服务端裁剪 detail |
| 测试 | PASS | L2 unlock |
| Review | PASS | Gap:真支付网关(须 Spec 修订 §9) |
**流程结论:** mock 商业闭环设计闭合。真支付 = 新一轮 Spec→契约→实现。
---
### 8. 成长报告 · reports
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | |
| map / page-tree | PASS | `/reports` + `/reports/:id`page-tree 已对齐) |
| 契约 | PASS | GET list/detail |
| 实现 | PASS | ReportsPage · ReportPage · Mine 入口 |
| 测试 | PARTIAL | 详情流较强;列表专项可补 |
| Review | PASS | Gap:收藏、PDF |
**流程结论:** 设计闭合。
---
### 9. 分享卡 · share
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | 前端 query 载荷 |
| map / page-tree | PASS | `/share` |
| 契约 | N/A | 无专用 APISpec 已写) |
| 实现 | PASS | ShareSheet/Card/Page |
| 测试 | PARTIAL | 有分享相关测 |
| Review | PASS | Gap:短链服务、系统分享 |
**流程结论:** P1 设计闭合。短链需新 API → 先改 Spec §8/§9。
---
### 10. 陪伴 · companion
| 步 | 结果 | 笔记 |
|---|---|---|
| Spec | PASS | **明确 P1 Shell / P2** |
| map / page-tree | PASS | `/companion` |
| 契约 | PARTIAL | solar-terms + moods API 有;UI 未接 moods |
| 实现 | SHELL | 本地节气;心情文案占位 |
| 测试 | N/A | 壳不要求深测 |
| Review | PASS | **禁止**未改 Phase 就做心情 OS |
**流程结论:** 壳范围设计闭合。P2 开工 = 升 Spec Phase + 补 §4/§7/§12 后再编码。
---
## 流程门禁抽查(本轮)
- [x] 无 Spec 的 P1 功能:无
- [x] Spec 均含 §4 / §7 / §9 / §12
- [x] feature-map 已链到 Spec
- [x] 陪伴未误标为 P1 Feature Complete
- [x] 横切埋点统一登记为 Gap,未假装已完成
- [x] **本轮不编码**——仅文档与 page-tree 对齐
---
## 批准编码时的推荐切片(需你点名后再动)
| 切片 | 先改 Spec | 再改代码 |
|---|---|---|
| A. 埋点最小集 | 各 Spec §11 选 5 个核心事件 | H5 统一 `track()` + GA |
| B. 探索测试草稿恢复 | explore-test §4/§7 | localStorage 恢复答案 |
| C. 真支付 | membership §9/§7 | 支付适配器 + 回调 |
| D. 陪伴 P2 | companion Phase→P2 | moods UI |
---
## 签字栏(人工)
| 角色 | 确认 | 日期 |
|---|---|---|
| 产品/你 | 走查结论是否接受 | |
| 开发开工 | 从切片 A/B/C/D 择一 | |
+32
View File
@@ -0,0 +1,32 @@
# P2 Backlog — 探索三模块 + 合规全量目录
**状态:`P2 Complete`(见 [../p2-status.md](../p2-status.md)**
**命名决策:** 星座 / 身心节律 / 意象卡片;UI 无「塔罗」主入口、无「算命/占卜」恐吓
**契约:** [../lexicon.md](../lexicon.md) · [../feature-map.md](../feature-map.md) · [../STRATEGY.md](../STRATEGY.md)
真支付:部署阶段。排除:消息 / 达人 / UGC 广场。星座模块内允许日周月年运(非独立运势 Feed)。
---
## 模块 ↔ Spec
| 顺序 | 模块 | Spec | 路由 | 状态 |
|---|---|---|---|---|
| 0 | 探索目录 | — | `/explore` · `/explore/:category` | Done |
| 1 | 星座 | [star-profile.md](star-profile.md) | `/star` · `/synastry` | Done |
| 2 | 身心节律 | [life-rhythm.md](life-rhythm.md) | `/rhythm` | Done |
| 3 | 意象卡片 | [image-card.md](image-card.md) | `/cards` | Done(≥78 牌 · ≥8 场景) |
| 4 | 量表矩阵 | [explore-test.md](explore-test.md) | `/scales/*` | Done(≥8 |
| 5 | 成长计划 | companion / growth | `/growth-plan` | Done |
| 6 | 心情轨迹 | companion | `/companion` | Done |
---
## 签字栏
| 项 | 状态 |
|---|---|
| 设计三 Spec | Done |
| 探索 catalog API | Done |
| L0L3 验证 | Done(见 p2-status |
| 真支付 | 部署阶段(不挡 P2 Complete |
+71
View File
@@ -0,0 +1,71 @@
# Feature Spec 索引
规范:[../feature-design.md](../feature-design.md) · 模板:[_TEMPLATE.md](_TEMPLATE.md)
| Spec | 功能 | feature-map | 主要路由 | Phase |
|---|---|---|---|---|
| [home.md](home.md) | 首页 / 发现入口 | §1 首页 | `/` | P1 |
| [profile.md](profile.md) | 个人档案 | §1.1 · §5.1 | `/profile` | P1 |
| [account-auth.md](account-auth.md) | 账号登录 | §5.x | `/login` | P1 |
| [profile-bootstrap.md](profile-bootstrap.md) | 生日包生成 | §1.1 | profiles→reports | P1 |
| [portrait.md](portrait.md) | 个人画像 | §2.1 · §2.3 | `/portrait` | P1 |
| [relation.md](relation.md) | 关系理解 | §2.4 | `/relation` | P1 |
| [explore-test.md](explore-test.md) | 探索测试 | §2.2 | `/explore` · `/scales/:slug` | P1 |
| [ask.md](ask.md) | AI 成长助手 | §3 | `/ask` | P1 |
| [membership.md](membership.md) | 深度版 / 成长会员 | §6 · §5.3 | `/membership` | P1 |
| [reports.md](reports.md) | 成长报告列表/详情 | §2.1.2 · §5.2 | `/reports` · `/reports/:id` | P1 |
| [share.md](share.md) | 分享卡 | journey 双引擎 | `/share` | P1 |
| [companion.md](companion.md) | 陪伴(节气+心情) | §4 | `/companion` | P2 Complete |
| [analytics.md](analytics.md) | 增长埋点最小集 | 横切 | H5 `track` | P1 |
| [star-profile.md](star-profile.md) | 星象性格 | §2.6 | `/star` | P2 Complete |
| [life-rhythm.md](life-rhythm.md) | 身心节律 | §2.7 | `/rhythm` | P2 Complete |
| [image-card.md](image-card.md) | 意象卡片 | §2.8 | `/cards` | P2 Complete |
| [ops-admin.md](ops-admin.md) | 运营后台 | §7 | `admin-h5` `/` `/users/:id` … | Ops-A |
| [ops-analytics.md](ops-analytics.md) | 运营行为分析(埋点+数据看板) | §7 | `admin-h5` `/analytics` · H5 track | Ops-B · ECR-007 |
| [ops-content.md](ops-content.md) | 运营内容(宫格+测评上下架) | §7 | `admin-h5` `/content` · `GET /home/tools` | Ops-C · ECR-008 |
| [ops-commerce.md](ops-commerce.md) | 运营商业加深(订单筛选+展示价+退款只读) | §7 | `admin-h5` `/orders` `/pricing` | Ops-D · ECR-009 |
| [ops-system.md](ops-system.md) | 运营系统(RBAC+封禁+推送占位) | §7 | `admin-h5` `/push` `/admins` | Ops-E · ECR-010 |
| [input-compliance.md](input-compliance.md) | 用户文字输入合规 | 横切 · 安全 | 各写接口 · code 40060 | P2 · ECR-012 |
| [ops-rbac.md](ops-rbac.md) | 运营 RBAC | §7 | `admin-h5` `/me` permissions · `/admin/roles*` | Ops · **ECR-013A** |
| [ops-redemption-code.md](ops-redemption-code.md) | 兑换码 RedemptionCode | §7 | `admin-h5` `/codes` · `POST /membership/redeem` | Ops · **ECR-015(local)** |
| [ops-user-intelligence.md](ops-user-intelligence.md) | 用户洞察 UserIntelligence | §7 | `admin-h5` 用户详情「洞察」 | Ops · **ECR-016(local)** |
| [ops-ask-operations.md](ops-ask-operations.md) | 问答运营 AskOperations | §7 | `admin-h5` `/ask` | Ops · **ECR-017** |
| [ops-entitlement.md](ops-entitlement.md) | 用户权益 Entitlement | §7 | `admin-h5` 用户详情「权益」 | Ops · **ECR-018** |
| [ops-content-safety.md](ops-content-safety.md) | 内容安全 ContentSafety | §7 | `admin-h5` `/safety` | Ops · **ECR-019** |
| [ops-quality-feedback.md](ops-quality-feedback.md) | 问答质量反馈 QualityFeedback | §7 | `admin-h5` `/ask` | Ops · **ECR-020** |
| [ops-ai-core-config.md](ops-ai-core-config.md) | AI 核心配置 AICoreConfig | §7 | `admin-h5` `/ai` | Ops · **ECR-021** |
| [ops-crisis-care.md](ops-crisis-care.md) | 危机关怀 CrisisCare | §7 | `admin-h5` `/crisis` | Ops · **ECR-022** |
| [ops-knowledge-source.md](ops-knowledge-source.md) | AI 知识源 KnowledgeSource | §7 | `admin-h5` `/ai` | Ops · **ECR-023** |
| [ops-banner.md](ops-banner.md) | OpsCMS Banner(只读基线) | §7 | `admin-h5` `/cms` | Ops · **ECR-024** |
| [ops-banner-write.md](ops-banner-write.md) | OpsCMS Banner **写面** | §7 | admin CMS 写 · `GET /home/banners` | Write-Wave · **ECR-041** |
| [ops-feed-slot.md](ops-feed-slot.md) | OpsCMS FeedSlot(只读基线) | §7 | `admin-h5` `/cms` | Ops · **ECR-025** |
| [ops-feed-slot-write.md](ops-feed-slot-write.md) | OpsCMS FeedSlot **写面** | §7 | admin CMS 写 · `GET /home/feed-slots` | Write-Wave · **ECR-042** |
| [ops-scheduled-publication.md](ops-scheduled-publication.md) | OpsCMS ScheduledPublication | §7 | `/admin/cms/publications*` | Ops · **ECR-026** |
| [ops-knowledge-chunk.md](ops-knowledge-chunk.md) | AICoreConfig KnowledgeChunk | §7 | `/admin/ai/knowledge-chunks*` | Ops · **ECR-027** |
| [ops-tool-definition.md](ops-tool-definition.md) | AICoreConfig ToolDefinition | §7 | `/admin/ai/tools*` | Ops · **ECR-028** |
| [ops-block-policy.md](ops-block-policy.md) | ContentSafety BlockPolicy | §7 | `/admin/content-safety/block-policies*` | Ops · **ECR-029** |
| [ops-moderation-case.md](ops-moderation-case.md) | ContentSafety ModerationCase | §7 | `/admin/content-safety/cases*` | Ops · **ECR-030** |
| [ops-crisis-event.md](ops-crisis-event.md) | CrisisCare CrisisEvent | §7 | `/admin/crisis/events*` | Ops · **ECR-031** |
| [ops-intervention-outcome.md](ops-intervention-outcome.md) | CrisisCare InterventionOutcome | §7 | `/admin/crisis/interventions*` | Ops · **ECR-032** |
| [ops-handoff-case.md](ops-handoff-case.md) | AskOperations HandoffCase | §7 | `/admin/ask/handoffs*` | Ops · **ECR-033** |
| [ops-privacy-request.md](ops-privacy-request.md) | AdminGovernance PrivacyRequest | §7 | `/admin/privacy/requests*` | Ops · **ECR-034** |
| [ops-star-config.md](ops-star-config.md) | ExploreConfig StarConfig(只读) | §7 | `/admin/explore/star-configs*` | Ops · **ECR-035** |
| [ops-star-config-write.md](ops-star-config-write.md) | StarConfig **写面** | §7 | admin 写 · `GET /star/configs` | ExploreConfig · **ECR-043** |
| [ops-rhythm-config.md](ops-rhythm-config.md) | ExploreConfig RhythmConfig(只读) | §7 | `/admin/explore/rhythm-configs*` | Ops · **ECR-036** |
| [ops-rhythm-config-write.md](ops-rhythm-config-write.md) | RhythmConfig **写面** | §7 | admin 写 · `GET /rhythm/configs` | ExploreConfig · **ECR-044** |
| [ops-image-card-deck.md](ops-image-card-deck.md) | ExploreConfig ImageCardDeck(只读) | §7 | `/admin/explore/image-card-decks*` | Ops · **ECR-037** |
| [ops-image-card-deck-write.md](ops-image-card-deck-write.md) | ImageCardDeck **写面** | §7 | admin 写 · `GET /cards/decks` | ExploreConfig · **ECR-045** |
| [ops-report-template.md](ops-report-template.md) | GrowthInsights ReportTemplate(只读) | §7 | `/admin/growth/report-templates*` | Ops · **ECR-038** |
| [ops-report-template-write.md](ops-report-template-write.md) | ReportTemplate **写面** | §7 | admin POST/PUT · growth.write | GrowthInsights · **ECR-048** |
| [ops-funnel-definition.md](ops-funnel-definition.md) | GrowthInsights FunnelDefinition(只读) | §7 | `/admin/analytics/funnel-definitions*` | Ops · **ECR-039** |
| [ops-funnel-definition-write.md](ops-funnel-definition-write.md) | FunnelDefinition **写面** | §7 | admin POST/PUT · growth.write | GrowthInsights · **ECR-047** |
| [ops-scale-definition.md](ops-scale-definition.md) | ExploreConfig ScaleDefinition(只读) | §7 | `/admin/explore/scales*` | Ops · **ECR-040** |
| [ops-scale-definition-write.md](ops-scale-definition-write.md) | ScaleDefinition **写面** | §7 | admin POST/PUT · status 仍 ECR-008 | ExploreConfig · **ECR-046** |
新功能:复制 `_TEMPLATE.md` → 填满 → 在本表登记 → 再编码。
**P1 全量流程走查:** [P1-PROCESS-REVIEW.md](P1-PROCESS-REVIEW.md)
**P2 收口状态:** [../p2-status.md](../p2-status.md) · [P2-BACKLOG.md](P2-BACKLOG.md)
**竞品逆向(测测前端全量):** [cece-frontend-re/](cece-frontend-re/README.md) · **完整设计包:** [cece-frontend-re/complete-design/](cece-frontend-re/complete-design/README.md) · 方法见 [../../design/reverse-engineering-spec.md](../../design/reverse-engineering-spec.md)
+203
View File
@@ -0,0 +1,203 @@
# Feature Spec: \<Name\>
> 复制本文件为 `<id>.md`。规范:[../feature-design.md](../feature-design.md)
> 语言:[../lexicon.md](../lexicon.md) · 能力树:[../feature-map.md](../feature-map.md)
> Status: `Draft` | `Active` | `Deprecated`
> Map node: (如 `2.3 个人画像 [P1]`
> Phase: `P1` | `P2` | `P3`
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | |
| Purpose | |
| Business Goal | |
**In Scope / Out of Scope**(防止偷偷扩 scope
| In | Out |
|---|---|
| | |
---
## 2. 用户价值
必须回答:
1. 用户为什么需要它?
2. 用户完成后获得什么?
3. 为什么愿意付费?(若无付费面,写 N/A)
---
## 3. 用户角色
对齐当前 IdentityVisitor 设备身份 + 可选升级)。写清**实际能做什么**,勿照搬竞品。
| Actor | 说明 | 本功能能力 |
|---|---|---|
| Guest / Visitor | 未登录设备身份 | |
| User | 已有持久用户/档案 | |
| VIP | 成长会员 active | |
| DeepAccess | 单份报告深度版已购 | |
---
## 4. 用户流程
```text
进入
```
或 mermaid。必须含:无数据分支、权益分支、失败分支(可简写并在 §6 展开)。
---
## 5. 页面设计
对照 [../page-tree.md](../page-tree.md)。
| 路由 | 页面 | 说明 |
|---|---|---|
| | | |
页面结构示例:
```text
/path
├── Empty State
├── Loading State
├── Result / Normal State
└── Locked State
```
---
## 6. 页面状态规范
| 状态 | 说明 | UI 行为 |
|---|---|---|
| Loading | 请求中 | |
| Empty | 无数据 | 引导去哪 |
| Error | 失败 | 重试/返回 |
| Normal | 成功 | |
| Locked | 付费/权益限制 | CTA |
---
## 7. Business Rules
编号规则;**权益与归属必须在 Server 判定**。
| ID | Rule |
|---|---|
| R1 | |
| R2 | |
---
## 8. 数据模型影响
指向 [../../domain/erd.md](../../domain/erd.md)。新增/变更表字段列表;无则写「无 schema 变更」。
| 表 | 变更 | 备注 |
|---|---|---|
| | | |
---
## 9. API 需求
路径级意图即可;字段细节以 `proto/openapi.yaml` 为准,**实现时必须同步 OpenAPI**。
| Method | Path | 意图 |
|---|---|---|
| | | |
Response 权益意图示例:`summary` 始终按规则返回;`detail` 无权益时剥离或 null。
---
## 10. 权限设计
| 能力 | Visitor | User | DeepAccess | VIP |
|---|---|---|---|---|
| 查看基础 | | | | |
| 查看完整 | | | | |
| 写入/生成 | | | | |
---
## 11. 埋点
未接分析 SDK 也先定义事件名。
| Event | 触发 |
|---|---|
| `<feature>_started` | |
| `<feature>_completed` | |
| `deep_access_clicked` | |
| `purchase_completed` | |
---
## 12. 测试验收标准
### 主路径
**Given** …
**When** …
**Then** …
### 权益 / 异常
**Given** …
**When** …
**Then** …
---
## 13. AI 开发前检查
- [ ] Spec 本章齐全(无空关键节)
- [ ] feature-map 已挂树
- [ ] lexicon 文案已核对
- [ ] OpenAPI / erd 更新计划已明确
- [ ] §12 可转化为 L1/L2/E2E 用例
---
## 14. Implementation Notes
编码时填写(首次实现或重大变更):
| 项 | 内容 |
|---|---|
| Packages | `apps/api/internal/...` · `apps/user-h5/src/...` |
| Migrations | |
| Gaps vs Spec | `Gap:` 未实现项) |
| Tests | L1 / L2 / e2e 路径 |
---
## 附录:子能力展开检查(复杂功能必填)
防止只写「入口 → 结果 → 分享」。按需勾选/展开:
- [ ] 入口与列表
- [ ] 主操作流程(逐步)
- [ ] 中断 / 恢复 / 草稿
- [ ] 结果生成(免费层)
- [ ] 深度层 / 付费墙
- [ ] 分享
- [ ] AI 解释 / 追问入口
- [ ] 数据统计 / 埋点
- [ ] 验收标准覆盖上述每一项
示例(探索测试):测试入口 · 列表 · 题目流程 · 答题保存 · 中断恢复 · 结果生成 · 免费层 · 深度层 · 分享 · AI 解释 · 统计 · 验收。
+164
View File
@@ -0,0 +1,164 @@
# Feature Spec: 账号登录
> Status: `Active` · Map: `5.x 账号 [P1+]` · Phase: `P1`
> 规范:[../feature-design.md](../feature-design.md)
> 关联:[profile-bootstrap.md](profile-bootstrap.md)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 账号登录(小程序微信;H5 过渡账密) |
| Purpose | 跨设备持久用户身份;未登录不可生成/查看生日衍生结果 |
| Business Goal | 数据归属清晰;咨询与魔方同一人;为会员与深度版付费打底 |
| In | Out |
|---|---|
| 小程序微信登录 / 登出 / me | 短信 OTP |
| 设备身份绑定到已注册账号 | 游客可看完整报告 |
| Bearer Session | 运营 Admin 登录(独立) |
---
## 2. 用户价值
1. 换手机后仍能看到自己的档案与报告。
2. 登录后输入生日一次生成、各页直读。
3. N/A(登录本身免费)。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| Visitor | 仅设备身份;可打开登录页;**不可**建档出结果 |
| User(已注册) | CRUD 本人档案与 TA;读已生成报告 |
| VIP / DeepAccess | 同前,权益不变 |
---
## 4. 用户流程
```text
进入结果页或建档
未登录? → 小程序 login-pop(微信)或 H5 /login(过渡账密)
Device 绑定到账号 User
进入档案 / 结果页(读缓存报告)
```
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/login` | H5 LoginPage(过渡账密;小程序已删除此页) |
| 小程序 `login-pop` | 微信手机号授权(唯一 C 端登录) |
| `/mine` | 展示账号手机号尾号 + 退出 |
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Loading | 登录中 |
| Error | 密码错误 / 手机号已注册 |
| Normal | 跳转 redirect 或 /mine |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | **小程序:** 微信 `code` + 手机号授权登录;按 `wx_openid` 命中,否则按手机号合并历史账密账号;未命中则建号 |
| R2 | **H5 过渡:** OpenLogin(任意非空手机号+密码)仍可用,避免 H5 断服;小程序不再提供账密页。正式关掉账密须另改本 Spec |
| R3 | 登录成功后:签发 sessiondevice_identities.user_id 改绑到账号 |
| R4 | 生成/查看档案与报告 API 必须已注册(users.phone 非空)且有效 session 或已绑设备账号 |
| R5 | 登出作废 session;设备可再登录其他账号 |
| R6 | 正式环境恢复校验前须改回本 Spec |
| R7 | 新账号未填昵称时,服务端用「意象词+场景词」词库(100×100)随机生成,如心语岛、微光谷 |
| R8 | 账号昵称可在个人档案页修改(PATCH `/auth/me`);首页与各页「自己」展示位统一用昵称(合盘/问答/星座/档案卡) |
| R9 | 账号头像可在「我的」页更换:相册或拍照上传;服务端持久化;GET `/auth/me` 返回 `avatar_url`;未设置时 UI 用愈心小人正面默认头像(`public/default-avatar.png`,源图 `public/logo/愈心小人1.png` |
---
## 8. 数据模型影响
- `users.phone` UNIQUE · `users.wx_openid` UNIQUE · `users.wx_unionid` · `users.java_platform_user_id` · `users.password_hash` · `users.nickname` · `users.avatar_url`
- `user_sessions(token, user_id, expires_at)`
- 本地文件:`data/avatars/{user_id}.{jpg|png|webp}`(进程相对路径)
---
## 9. API 需求
| Method | Path | 说明 |
|---|---|---|
| POST | `/api/v1/auth/wechat` | 小程序微信登录 `{ code, encryptedData, iv }` |
| POST | `/api/v1/auth/register` | H5 过渡注册(可带 nickname |
| POST | `/api/v1/auth/login` | H5 过渡登录 |
| POST | `/api/v1/auth/logout` | 登出 |
| GET | `/api/v1/auth/me` | 当前账号(含 avatar_url |
| PATCH | `/api/v1/auth/me` | 更新昵称 `{ nickname }` |
| POST | `/api/v1/auth/me/avatar` | multipart `file`jpeg/png/webp;≤2MB → 更新 avatar_url |
| GET | `/api/v1/media/avatars/:file` | 公开读头像文件 |
---
## 10. 权限设计
| 能力 | Visitor | User |
|---|---|---|
| register/login | ✓ | ✓ |
| profiles / reports 写读 | ✗ | ✓ |
| 上传头像 | ✗ | ✓ |
| 读头像媒体 | ✓ | ✓ |
---
## 11. 埋点
经统一 `track()`(见 [analytics.md](analytics.md) · [ops-analytics.md](ops-analytics.md))。
**非** P1 核心漏斗 5 事件;接入后走自有 `POST /analytics/events`(及可选 GA)。
禁止参数含手机号、明文密码、头像绝对 URL / `user_id`
| Event | 触发 | 可选 params |
|---|---|---|
| `auth_register` | 账号新建成功(含 OpenLogin 自动建号,`is_new=true` | `source`: login_page |
| `auth_login` | 已有账号登录成功(`is_new=false` | `source`: login_page |
| `auth_logout` | 用户在「我的」点退出且本地 session 已清 | `surface`: mine |
| `avatar_sheet_opened` | 「我的」打开更换头像 sheet | `surface`: mine |
| `avatar_upload_succeeded` | 头像上传 API 成功且 UI 刷新为新图 | `source`: album \| camera |
| `avatar_upload_failed` | 头像上传失败(校验/网络/服务端) | `source`: album \| camera · `reason`: too_large \| bad_type \| network \| server \| unknown |
| `nickname_updated` | PATCH 昵称成功 | `surface`: profile |
`page_view``/login` · `/mine` 由路由自动采集,本 Spec 不重复定义。
**实现状态:** 事件名以本表为准;H5 已挂 Login / Mine / Profile`track` → 自有 ingest + 可选 GA)。
---
## 12. 测试验收标准
| Given | When | Then |
|---|---|---|
| 新设备 | 未登录 POST portrait | 401 |
| 注册成功 | 建档 | 200 且生成报告包 |
| 登录另一设备 | list profiles | 见同一账号数据 |
| 已登录设备 | POST logout 后无 Bearer 再 GET /auth/me | 401(设备已解绑,刷新不再显示登录态) |
---
## 13. AI 开发前检查
- [x] lexicon:登录/注册/账号
- [x] 不碰 Admin Auth
- [x] 咨询域见 Spec `consult-miniprogram`ECR-050
+148
View File
@@ -0,0 +1,148 @@
# Feature Spec: 增长埋点(P1 最小集)
> Status: `Active` · Map: 横切增长 · Phase: `P1`(切片 A
> 规范:[../feature-design.md](../feature-design.md) · 走查:[P1-PROCESS-REVIEW.md](P1-PROCESS-REVIEW.md)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 增长埋点最小集 |
| Purpose | 用统一 `track()` 采集主漏斗关键节点,支撑转化分析 |
| Business Goal | 能量化:建档探索 → 深度版/会员;不阻塞主路径 |
| In | Out |
|---|---|
| H5 `track` + GA4(可配 Measurement ID | 服务端埋点中台 |
| 下文 **5 个核心事件** + 自动 `page_view` | 全量 Spec §11 一次接完 |
| DEV 可 debug 日志 | 采集生日/答题全文等 PII |
---
## 2. 用户价值
1. 用户无感(不改变主流程)。
2. 产品可看漏斗掉点。
3. 付费:N/A。
---
## 3. 用户角色
全部 Visitor/User 路径均可触发;不因埋点失败阻断功能。
---
## 4. 用户流程
```text
App 启动 → 若配置了 GA ID 则注入 gtag
路由变化 → page_view
主漏斗节点 → track(核心事件)
gtag 不可用 / 未配置 → no-op(可选 console debug
```
---
## 5. 页面设计
无独立页面。触点:`/` · `/portrait` · `/relation` · 深度版 CTA · pay-mock 成功。
---
## 6. 页面状态规范
N/A(横切)。要求:埋点失败不影响 UI。
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 统一经 `apps/user-h5/src/lib/analytics.ts``track`;页面禁止直接调 `window.gtag` |
| R2 | **P1 核心事件仅下表 5 个**(另加自动 `page_view`);其它 Spec §11 事件名保留,后续迭代再挂 |
| R3 | 禁止把生日、问答正文、档案 ID 明文作为事件参数(可用 `report_type` 等枚举) |
| R4 | `VITE_GA_MEASUREMENT_ID` 为空时 track 为 no-op,应用仍可用 |
| R5 | 事件名稳定,snake_case,与下表一致 |
### P1 核心事件字典(冻结)
| Event | 触发 | 可选 params |
|---|---|---|
| `home_cta_portrait` | 首页点「开始」且生日校验通过,即将进画像 | — |
| `portrait_completed` | 画像基础结果首次展示成功 | `source`: query\|report_id |
| `deep_access_clicked` | 用户点击深度版 CTA(画像/关系/报告) | `surface`: portrait\|relation\|report |
| `purchase_completed` | mock 支付成功且刷新后权益生效 | `kind`: deep_access\|membership |
| `relation_completed` | 关系理解基础结果展示成功 | — |
基础设施:
| Event | 触发 | params |
|---|---|---|
| `page_view` | 路由 afterEach | `page_path`, `page_title` |
---
## 8. 数据模型影响
无 DB。配置:`VITE_GA_MEASUREMENT_ID`H5)。
---
## 9. API 需求
无后端 API。
---
## 10. 权限设计
埋点不鉴权;不依赖登录态字段。
---
## 11. 埋点
见 §7 字典(本 Spec 即权威事件表)。
---
## 12. 测试验收标准
**Given** 未配置 GA ID
**When** 触发 `track('portrait_completed')`
**Then** 不抛错、不挡 UI
**Given** mock `window.gtag`
**When** `track('home_cta_portrait')`
**Then** gtag 被以 event 名调用
**Given** 用户完成画像基础结果
**When** 页面 Normal
**Then** 曾触发 `portrait_completed`(单测或集成对 track mock
---
## 13. AI 开发前检查
- [x] Spec 齐全
- [x] 仅 5 核心 + page_view
- [x] 无 PII 参数
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| Packages | `src/lib/analytics.ts` · `main.ts` · Home/Portrait/Relation/Report/Membership |
| Config | `VITE_GA_MEASUREMENT_ID` · `VITE_ANALYTICS_DEBUG``apps/user-h5/.env.example` |
| Legacy | 静态站曾用 `G-LVVXH3TL04`,可写入 `.env.local` |
| Tests | `analytics.spec.ts` |
| Process Review | 切片 A **已实现**2026-08-02 |
+184
View File
@@ -0,0 +1,184 @@
# Feature Spec: AI 成长助手(问答)
> Status: `Active` · Map: `§3 问答 [P1]` · Phase: `P1`
> 规范:[../feature-design.md](../feature-design.md)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | AI 成长助手 |
| Purpose | 结合个人档案,用对话帮助认识自己、理解关系、整理情绪与生活节奏 |
| Business Goal | 战略中心 Tab 留存;配额驱动会员 |
| In | Out |
|---|---|
| 挂 profile 的多轮对话;场景入口 | 占卜/运势/预测未来 |
| DeepSeek(可配)+ 规则引擎降级 | 医疗诊断 |
| 免费次数 + 额度包(ask_pack)+ 会员配额 | 无档案空聊(禁止) |
---
## 2. 用户价值
1. **为何需要:** 看完画像仍有具体情境问题。
2. **完成后获得:** 结合档案的结构化建议与可执行小步骤。
3. **为何付费:** 免费次数用尽后可购买问答额度包,或开通成长会员获得更多回复。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| Visitor | 有档案则可问;受配额限制 |
| VIP | 额外 Ask 配额 |
| 无档案 | 仅引导建档,不可消耗成功回复 |
---
## 4. 用户流程
```text
进入 /ask
无档案? → Empty 引导首页/档案
选择档案(我 / TA+ 可选场景
输入问题 → 检查配额
├─ 耗尽 → 引导购买额度包 / 成长会员(mock 支付后立刻加次)
└─ 有余 → 创建/续 thread → assistant **SSE 流式**回复(delta → done
DeepSeek 失败/无 key → 规则引擎降级(仍按字流式输出)
```
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/ask` | AskPageChatThread |
```text
/ask
├── 愈心 AI / 顾问 Tab
├── 顾问列表 → 顾问专属对话(?advisor=key · 顶栏返回回列表)
├── Empty(无档案)
├── Loading(发送中)
├── Normal(历史 + 输入)
├── Error(发送失败可重试)
└── Quota Exhausted(额度包 + 会员)
```
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Empty | 无档案引导 |
| Loading | 发送中禁用重复点 |
| Error | 失败 + 重试 |
| Normal | 消息列表 |
| Quota | 明确耗尽文案 + 额度包购买 + `/membership` |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 每条用户消息必须绑定 `profile_id`self 或 other |
| R2 | 免费回复次数有上限(实现:如 3);可购 `ask_pack` 加次;会员另计配额 |
| R3 | 配额耗尽返回明确业务错误,不生成付费假回复;引导购买额度或会员 |
| R7 | 扣次顺序:会员配额 → 已购额度包 → 免费额度(非会员);购买额度不解锁报告深度版 |
| R4 | LLM 可选;失败降级规则引擎,仍须 lexicon 安全 |
| R5 | 禁止占卜/算命/吉凶恐吓/医疗诊断;可用愈心解码·星座·人格匹配等探索向用语 |
| R6 | 回复宜短(约 80–160 字):回应当下 → 1 条档案洞察 → 1–2 条可执行建议;system prompt 须对齐 lexicon 与产品定位 |
---
## 8. 数据模型影响
| 表 | 备注 |
|---|---|
| `ask_threads` | user_id, profile_id |
| `ask_messages` | role, content |
| `ask_quotas` / 等价 | 余量 |
| `users.ask_paid_quota_left` | 已购额度包余量 |
---
## 9. API 需求
| Method | Path | 意图 |
|---|---|---|
| GET | `/api/v1/ask/quota` | 余量 |
| POST | `/api/v1/ask/threads` | 创建线程(profile_id, scene? |
| POST | `/api/v1/ask/threads/{id}/messages` | 发消息拿回复(默认 JSON) |
| POST | `/api/v1/ask/threads/{id}/messages?stream=1` | SSE`meta` / `delta` / `done` / `error` |
| DELETE | `/api/v1/ask/threads/{id}` | 清空该会话(软删除) |
| POST | `/api/v1/orders` kind=`ask_pack` | 购买额度包(plan: pack10/pack30/pack100 |
| POST | `/api/v1/orders/{id}/pay-mock` | 支付后增加 `ask_paid_quota_left` |
---
## 10. 权限设计
| 能力 | 无档案 | 有配额 | 配额耗尽 | VIP 有配额 |
|---|---|---|---|---|
| 提问 | ✗ | ✓ | ✗ | ✓ |
---
## 11. 埋点
| Event | 触发 |
|---|---|
| `ask_opened` | 进入页 |
| `ask_message_sent` | 发送 |
| `ask_reply_received` | 成功回复 |
| `ask_quota_exhausted` | 耗尽 |
| `ask_fallback_rule` | 走规则引擎 |
---
## 12. 测试验收标准
**Given** 有 Self 档案与配额
**When** 发送问题
**Then** 返回助手消息且含免责;配额减一
**Given** 配额为 0
**When** 再发送
**Then** 业务错误引导购买额度/会员,无助手胡编
**Given** 免费额度耗尽
**When** pay-mock `ask_pack` pack10
**Then** GET `/ask/quota` remaining ≥ 10,可继续提问
**Given** 无 DeepSeek key
**When** 提问
**Then** 规则引擎仍给出档案相关回复
---
## 13. AI 开发前检查
- [x] Spec 齐全 · map · lexicon · OpenAPI · 可测
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| Packages | `service/ask` · `internal/ask` · `internal/llm/deepseek` · `AskPage` |
| Config | `config.local.yaml` deepseek.* |
| Gaps | 长期记忆 P3;顾问预约仅占位;埋点未接 |
| Tests | ask reply L1;集成 threadAskPage.spec |
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · 设计闭合 · 实现 PASS · 测试 PASS |
@@ -0,0 +1,250 @@
# 00 · 测测前端总览(L0 IA · 全功能清单)
> Evidence: 以 E1 实测为主 · E2/E3 补充 · E6/E7 标明推断
---
## STEP 1 — 全局页面组成(App Shell)
### 1.1 底部导航(五 Tab)✅ E1
| Tab | 视觉权重 | 入口职责 |
|---|---|---|
| 首页 | 标准 | 发现 · 工具宫格 · 信息流 · 建档引导 |
| 消息 | 标准 | AI/达人/社区/系统/商业通知 |
| **问** | **中央突出 + AI 标识** | 战略入口 → 测测 AI(内含真人 1v1 Tab) |
| 在线 | 标准 | 达人 Marketplace |
| 我的 | 标准 | 账号 · 档案资产 · 会员订单 |
```text
┌─────────────────────────────┐
│ 页面内容区 │
├──────┬──────┬──────┬────┬───┤
│ 首页 │ 消息 │ 问* │在线│我的│
└──────┴──────┴──▲───┴────┴───┘
│ *中央悬浮突出 + AI 标识
```
### 1.2 全局浮层 / 横切 UI(推导)
| 元素 | 来源 | 说明 |
|---|---|---|
| 登录/绑定弹层 | 🟡 E6 | 游客触达付费/发帖时 |
| 会员购买半屏 | ✅ E1 商业描述 | 首月/包月/季/年 |
| 网络错误 Toast | 🔵 E7 | 全 App |
| 权限(相册/麦克风)系统弹窗 | 🔵 E7 | 沙盘/连麦/OCR |
| 青少年/合规提示 | 🟡 E6 | 泛心理合规 |
| 分享面板(微信/海报) | ✅ E2 裂变叙事 | 测评结果卡 |
| 角标(消息未读) | 🟡 E6 | 消息 Tab |
---
## STEP 2 — 前端功能全清单(Feature Inventory
### A. 导航与账号
| ID | 功能 | 证据 |
|---|---|---|
| NAV-01 | 五 Tab 切换 | ✅ E1 |
| NAV-02 | 「问」战略权重突出 | ✅ E1 |
| ACC-01 | 手机/微信/Apple 登录 | ✅ E1 基础信息 |
| ACC-02 | 游客 → 注册升级 | 🟡 E6 |
| ACC-03 | 账号设置/注销 | 🔵 E7 |
### B. 生命档案(前端核心资产)
| ID | 功能 | 证据 |
|---|---|---|
| PROF-01 | 创建本人档案(生日/时/地/性别) | ✅ E1 |
| PROF-02 | 创建关系档案(伴侣/朋友等) | ✅ E1 |
| PROF-03 | 多档案切换 | ✅ E1(AI 视角选择器) |
| PROF-04 | 首页「输入生日,更加了解 TA」引导 | ✅ E1 |
| PROF-05 | 档案编辑/删除 | 🟡 E6 |
| PROF-06 | 兴趣/状态标签 | 🟡 E4 |
### C. 首页工具宫格(快捷入口)✅ E1
| ID | 入口文案 | 域 |
|---|---|---|
| GRID-01 | I人E人(MBTI | 测评 |
| GRID-02 | 星座 | 星座内容 |
| GRID-03 | 星盘 | 本命/多盘型 |
| GRID-04 | 缘分合盘 | 合盘+指数 |
| GRID-05 | 沙盘 | 3D 心理沙盘 |
| GRID-06 | 陪伴小星 | AI 陪伴子入口 |
| GRID-07 | 商城 | 电商 |
| GRID-08 | 倾诉 | 咨询/AI |
| GRID-09 | AI 玩法广场 | UGC AI 小应用 |
| GRID-10 | 更多 | 收纳扩展 |
「更多」内公开提到(✅ E2):爱情树(依恋类型)、幸运地图、pick 卡等趣味测。
### D. 「问」AI 与双轨
| ID | 功能 | 证据 |
|---|---|---|
| ASK-01 | 测测 AI 对话 | ✅ E1 |
| ASK-02 | 顶栏「测测AI ‖ 真人1v1」 | ✅ E1 |
| ASK-03 | 视角:星盘维度 | ✅ E1 |
| ASK-04 | 对象:自己 / 已建档 TA | ✅ E1 |
| ASK-05 | 深度思考模式开关 | ✅ E1 |
| ASK-06 | 灵魂伴侣子入口(横向滑动) | ✅ E1 |
| ASK-07 | 预置引导问题(星盘向) | ✅ E1 |
| ASK-08 | 下拉历史消息 | ✅ E1 |
| ASK-09 | AI 心情小镇(多虚拟倾诉师) | ✅ E1/E2 |
| ASK-10 | 灵犀/小智(子场景/模式,非并列 Tab) | ✅ E1 纠正 |
### E. 星座 / 星盘 / 合盘 / 运势
| ID | 功能 | 证据 |
|---|---|---|
| AST-01 | 本命星盘展示与档案切换 | ✅ E3 |
| AST-02 | 多盘型(报道称可达约 20 种工具盘) | ✅ E3 |
| AST-03 | 合盘:比较盘/组合盘/时空盘/马克斯盘等 | ✅ E3 |
| AST-04 | 组合推运等推运变体 | ✅ E3 |
| AST-05 | 缘分指数(恋爱等) | ✅ E2 |
| AST-06 | 日/周/月/年运势 | ✅ E3/E4 |
| AST-07 | 附近的人 / 微信好友连线合盘 | 🟡 E3/行业 + 产品常见;【待真机补证】 |
### F. 测评与神秘学工具
| ID | 功能 | 证据 |
|---|---|---|
| TEST-01 | MBTI(修订量表+分享) | ✅ E1/E2 |
| TEST-02 | 双人 MBTI/性格关系 | ✅ E2 |
| TEST-03 | 塔罗抽牌/提问 | ✅ E3 |
| TEST-04 | 八字/紫微/生命数字等 | ✅ E3 |
| TEST-05 | 爱情树/幸运地图/pick 卡 | ✅ E2 |
| TEST-06 | 50+ 心理测试矩阵 | 🟡 E3 口径 |
### G. 沉浸体验
| ID | 功能 | 证据 |
|---|---|---|
| IMM-01 | 3D 心理沙盘 | ✅ E1/E2 |
| IMM-02 | AI 心情小镇(约 6 人设,含「明朗」) | ✅ E1 |
### H. 社区与内容
| ID | 功能 | 证据 |
|---|---|---|
| SOC-01 | 首页信息流(文章/视频/故事/达人) | ✅ E1 |
| SOC-02 | 今日运势/热门测试/专家推荐 | ✅ E4 |
| SOC-03 | AI 玩法广场 UGC 列表(热度/创作者) | ✅ E1 |
| SOC-04 | 赞评关私信 | 🟡 E4 |
### I. 在线达人
| ID | 功能 | 证据 |
|---|---|---|
| EXP-01 | 达人列表/筛选 | ✅ E1 |
| EXP-02 | 文字/语音/连麦咨询 | ✅ E1 |
| EXP-03 | 评价/复购 | 🟡 E6 |
| EXP-04 | 达人约 2.6 万签约口径 | ✅ E1 官方口径 |
### J. 商业化前端
| ID | 功能 | 证据 |
|---|---|---|
| PAY-01 | 会员:首月 9.9 / 续订 25/月;季 58;年 178 | ✅ E1 |
| PAY-02 | 报告解锁 / AI 次数 | ✅ E1 |
| PAY-03 | 咨询下单支付 | ✅ E1 |
| PAY-04 | 商城 | ✅ E1 宫格 |
| PAY-05 | 主动压缩干扰广告 | ✅ E1 |
### K. 增长
| ID | 功能 | 证据 |
|---|---|---|
| GRW-01 | 测评结果分享卡 | ✅ E1/E2 |
| GRW-02 | 邀请好友测 MBTI | ✅ E2 |
| GRW-03 | 签到/积分/勋章 | 🟡 E4 |
---
## STEP 3 — 全局用户流程
### 3.1 新用户冷启动 ✅ E1 场景
```text
打开 App
→(可选登录)首页
→ 点宫格 MBTI / 或看信息流
→ 完成测评 → 结果页 → 分享/付费墙
→ 引导建档(生日)
→ 可进入「问」或合盘
```
### 3.2 关系资产飞轮 ✅ E1
```text
首页「了解 TA」/ AI 对象切换
→ 录入对方生日建关系档案
→ AI 基于 TA 星盘回答 / 合盘
→ 分享结果 → 拉新
```
### 3.3 全局失败路径(必须实现)🔵 E7
| 场景 | 前端表现 |
|---|---|
| 断网/弱网 | 空态 + 重试;消息/AI 发送失败可重发 |
| Token 失效 | 跳登录;草稿保留 |
| 接口超时 | Toast + 重试 |
| 会员限制 | VIPLocked 半屏 |
| 余额不足(咨询) | 充值/支付 |
| 审核失败(UGC) | 说明原因 |
| 数据为空 | Empty 插画 + CTA |
---
## STEP 4 — 全局状态机(App Shell
```mermaid
stateDiagram-v2
[*] --> Init
Init --> Loading: 启动
Loading --> GuestHome: 无登录
Loading --> AuthedHome: 已登录
GuestHome --> LoginRequired: 触达 gated
LoginRequired --> AuthedHome: 登录成功
AuthedHome --> Offline: 断网
Offline --> AuthedHome: 恢复
AuthedHome --> VIPLocked: 点深度权益
VIPLocked --> AuthedHome: 购买或关闭
AuthedHome --> Error: 致命错误
Error --> AuthedHome: 重试
```
页面级状态见各 Tab 文档。
---
## 页面路由树(前端逻辑路由 · 推导)
```text
/ 首页
/message 消息
/ask 问(默认 AI)
/ask?mode=human 真人1v1
/online 在线达人列表
/online/:expertId 达人详情
/consult/:sessionId 咨询会话
/mine 我的
/profile/list 档案列表
/profile/edit/:id 档案编辑
/tools/mbti MBTI
/tools/chart 星盘
/tools/synastry 缘分合盘
/tools/sandbox 沙盘
/tools/plaza AI玩法广场
/tools/plaza/:appId 玩法详情
/tools/tarot 塔罗
/tools/bazi 八字…
/membership 会员
/orders 订单
/shop 商城
/mood-town AI心情小镇
```
路径名为 🔵 工程命名;测测真实 Deep Link 【待真机补证】。
@@ -0,0 +1,118 @@
# 01 · Tab「首页」逆向设计
> Evidence: ✅ E1 实测 · ✅ E2「更多」工具 · 🟡/🔵 补全交互
---
## STEP 1 — UI Analysis
### 区域结构(自上而下)
| # | 区域 | 可见元素 | 证据 |
|---|---|---|---|
| H1 | 顶栏 | 可能含搜索/消息入口;「输入生日,更加了解 TA」引导条 | ✅ E1 |
| H2 | 用户/档案摘要 | 当前本人档案摘要或未建档 CTA | 🟡 E6 |
| H3 | 功能宫格 | I人E人、星座、星盘、缘分合盘、沙盘、陪伴小星、商城、倾诉、AI玩法广场、更多 | ✅ E1 |
| H4 | 运营 Banner | 活动/会员/新品 | 🟡 E6 |
| H5 | 推荐信息流 | 今日运势、热门测试、AI入口、专家推荐、文章/视频/故事/达人内容 | ✅ E1/E4 |
| H6 | 底部 Tab Bar | 全局 | ✅ E1 |
### 宫格 Icon 全集(不得遗漏)✅ E1
1. I人E人(MBTI
2. 星座
3. 星盘
4. 缘分合盘
5. 沙盘
6. 陪伴小星
7. 商城
8. 倾诉
9. AI玩法广场
10. 更多 → 二级页:爱情树、幸运地图、pick卡… ✅ E2
### AI 玩法广场页内元素 ✅ E1
- Slogan:「全民手搓创意——精选应用」
- 列表卡片:应用名、热度(如 SBTI 305.7 万)、创作者名
- 示例:SBTI 测试版、答案之书、三生三世你和 Ta、灵魂伴侣
---
## STEP 2 — Feature Analysis(逐元素)
| 元素 | 作用 | 点击 | 长按/其它 | 权限/VIP | 分享 |
|---|---|---|---|---|---|
| 了解 TA 引导 | 建关系档案 | 进档案创建表 | — | 登录 | 否 |
| MBTI | 拉新测评 | 进量表流程 | — | 部分结果免费 | 结果强分享 |
| 星座 | 内容/运势 | 星座频道 | — | 深度会员 | 文章可分享 |
| 星盘 | 本命排盘 | 星盘页+档案切换 | — | 多盘型/详解会员 | 海报 |
| 缘分合盘 | 双人匹配 | 选 A/B→报告 | — | 指数免费/深文案付费 | 指数卡 |
| 沙盘 | 沉浸投射 | 3D 沙盘 | — | 可能次数限制 | 场景图 |
| 陪伴小星 | AI 陪伴 | 进子场景/问 | — | AI 次数 | 否 |
| 商城 | 电商 | 商品列表 | — | 登录支付 | 商品 |
| 倾诉 | 咨询/AI | 分流问/在线 | — | — | 否 |
| AI玩法广场 | UGC 应用集市 | 列表→应用 | — | 视应用 | 应用结果 |
| 信息流卡片 | 消费/转化 | 详情/达人/测试 | 可能不喜欢 | — | 内容分享 |
| 更多 | 收纳 | 二级宫格 | — | — | — |
---
## STEP 3 — User Flow
### 主流程:测评拉新
```text
首页 → MBTI → 答题 → Loading → 结果
→ 分享 / 解锁完整 / 邀请好友再测
→ 失败:网络错误重试;中途退出保存进度【待真机】
```
### 主流程:建 TA 档案
```text
首页引导 → 填写生日/关系类型 → 保存
→ 可用于合盘 / AI 对象切换
→ 失败:校验生日非法;未登录 → LoginRequired
```
### 主流程:玩法广场
```text
宫格 → 广场列表 → 选应用 → 互动 → 结果 → 热度/分享
→ Empty:无应用;审核中不可见 🔵
```
---
## STEP 4 — 状态机
| 状态 | UI |
|---|---|
| Init/Loading | 骨架屏 |
| Loaded | 宫格+流 |
| EmptyFeed | 流空+推荐宫格 |
| Offline | 顶条提示 |
| LoginRequired | 登录半屏 |
| VIPLocked | 会员半屏 |
| Error | 重试 |
```mermaid
stateDiagram-v2
[*] --> Loading
Loading --> Loaded
Loading --> Error
Loaded --> LoginRequired
Loaded --> VIPLocked
Loaded --> Offline
Offline --> Loaded
Error --> Loading: 重试
```
---
## 页面验收(前端)
- [ ] 宫格 9+更多与 E1 一致(版本差分记日志)
- [ ] 「了解 TA」可达档案创建
- [ ] 玩法广场展示热度与创作者
- [ ] 信息流可下拉刷新 / 分页 🔵
@@ -0,0 +1,55 @@
# 02 · Tab「消息」逆向设计
> Evidence: ✅ E1/E4 分类 · 细交互多为 🟡/🔵(【待真机补证】)
---
## STEP 1 — UI Analysis
| 区域 | 元素 | 证据 |
|---|---|---|
| 顶栏 | 标题「消息」· 可能「一键已读」 | 🟡 E6 |
| 分类 Tab/分组列表 | AI 消息 · 达人消息 · 社区互动 · 系统 · 商业 | ✅ E4 |
| 会话行 | 头像 · 标题 · 摘要 · 时间 · 未读红点 | 🟡 E6 |
| 空态 | 插画 +「去问问 AI」CTA | 🔵 E7 |
| 底栏 | 全局 Tab,消息角标 | 🟡 E6 |
---
## STEP 2 — Feature Analysis
| 类型 | 作用 | 点击 | 删除/免扰 | 登录 |
|---|---|---|---|---|
| AI 消息 | 会话提醒/未读 AI | 进「问」对应线程 | 可删会话 🟡 | 是 |
| 达人消息 | 咨询回复 | 进咨询会话 | 是 | 是 |
| 社区 | 赞评关私信 | 进动态/私信 | 是 | 是 |
| 系统 | 公告/合规 | 详情页 | 通常不可删 | 是 |
| 商业 | 会员到期/订单/活动 | 会员/订单页 | 是 | 是 |
长按:删除会话 / 标记已读 / 免打扰 🟡 E6。
---
## STEP 3 — User Flow
```text
进入消息 → Loading → 列表
→ 点 AI 会话 → /ask 历史
→ 点达人 → 咨询页(可能支付状态校验)
→ 点系统 → H5/原生详情
失败:Token 失效登录;离线缓存只读 🔵
```
---
## STEP 4 — 状态机
Init → Loading → Loaded | Empty | Offline | Error | LoginRequired
未读数:本地角标 ↔ 服务端 sync 🔵。
---
## 后台推导(摘要 · 详见 08
推送通道、消息模板、免打扰时段、达人回复 SLA 监控 🔵。
@@ -0,0 +1,101 @@
# 03 · Tab「问」逆向设计(测测 AI + 真人 1v1)
> Evidence: ✅ E1 实测最完整 · 核心战略入口
---
## STEP 1 — UI Analysis
### 进入方式
- 底部中央「问」悬浮大按钮 + AI 标识 ✅ E1
### 对话页结构 ✅ E1
| 区域 | 元素 |
|---|---|
| 顶栏 | Tab**测测AI** ‖ **真人1v1** |
| 提示 | 「下拉可浏览历史消息」 |
| 消息区 | 气泡列表 · 引导问题卡片(冷启动) |
| 上下文条(输入框上方) | **星盘**(解读维度)· **对象名**(默认「自己」,可切 TA)· **深度思考** |
| 右侧滑动 | **灵魂伴侣** 子入口 |
| 输入区 | 文本框 · 发送 · 可能语音 🟡 |
| 预置问题示例 | 「什么样的朋友适合我」「下周的财富情况如何」「本月在人际上需要注意什么」等(星盘向) |
### 子场景(非并列 Tab)✅ E1
- 灵魂伴侣:测测 AI 生态内横向入口
- AI 心情小镇:独立沉浸(多从首页/运营进入)· 约 6 位虚拟倾诉师 · OCR/情感识别 · 角色「明朗」等
- 灵犀 / 小智:更接近模式或子场景,**不是**与测测 AI 同级的底部入口
---
## STEP 2 — Feature Analysis
| 元素 | 作用 | 点击后 | VIP/次数 | 其它 |
|---|---|---|---|---|
| 测测AI Tab | 免费/限额 AI | 保持 AI 会话 | AI 次数/会员扩容 | — |
| 真人1v1 Tab | 达人咨询 | 达人列表或推荐咨询 | 付费 | 可从 AI 低摩擦切换 |
| 星盘标签 | 切换解读维度 | 维度面板【待真机】 | — | — |
| 对象名称 | 切换档案 | 档案选择器(自己/TA) | 需已建档 | 长按?【待真机】 |
| 深度思考 | 更高推理模式 | Toggle;可能耗更多额度 | 可能会员 | — |
| 灵魂伴侣 | 子场景 | 进入专项互动 | 视产品 | 可分享 🟡 |
| 引导问题 | 冷启动 | 自动填入并发送 | 计次 | — |
| 发送 | 提交 | Streaming 回复 | 额度不足 → 会员墙 | 防重复点击 🔵 |
| 下拉历史 | 翻旧消息 | 分页加载 | — | ≠ 长期记忆 |
---
## STEP 3 — User Flow
### AI 主路径
```text
点「问」→ Loading 会话
→ 展示引导问题(星盘向)
→ 可选:切换对象为 TA(无档案则引导创建)
→ 可选:开深度思考
→ 发送 → Streaming
→ 可切换「真人1v1」升单
```
### 失败 / 边界
| 场景 | 处理 |
|---|---|
| 无额度 | VIPLocked / 看广告?【待真机】 |
| 敏感内容 | 拒答 + 转介真人/热线 🔵 |
| 超时 | 重试气泡 |
| 对象无星盘数据 | 引导补全出生信息 |
| 中重度心理危机 | 明确边界文案 + 转介 🔵 |
---
## STEP 4 — 状态机
```mermaid
stateDiagram-v2
[*] --> Loading
Loading --> IdleEmpty: 新会话
Loading --> IdleWithHistory: 有历史
IdleEmpty --> Streaming: 发送/点引导
IdleWithHistory --> Streaming
Streaming --> IdleWithHistory: 完成
Streaming --> Failed: 错误
Failed --> Streaming: 重试
IdleWithHistory --> LoginRequired
IdleWithHistory --> VIPLocked: 额度用尽
IdleWithHistory --> HumanRail: 切真人1v1
```
状态枚举:Init · Loading · IdleEmpty · IdleWithHistory · Streaming · Failed · Retrying · Offline · LoginRequired · VIPLocked · HumanRail · PermissionDenied(麦克风)
---
## 差异化要点(产品事实)✅ E1
1. AI **挂星盘档案**,非通用闲聊
2. **对象切换**把「了解自己」扩到「分析关系」
3. AI ‖ 真人 **同页双轨**
已知缺口(公开评价)✅ E1:偏被动触达;跨会话长期记忆不足;引导问题偏运势易被感知为「算命 AI」。
@@ -0,0 +1,57 @@
# 04 · Tab「在线」逆向设计(达人 Marketplace
> Evidence: ✅ E1 双边平台描述 · 列表 UI 细节 🟡【待真机】
---
## STEP 1 — UI Analysis
| 区域 | 元素 | 证据 |
|---|---|---|
| 顶栏 | 搜索达人 · 筛选(领域/价格/好评) | 🟡 E6 |
| 运营位 | 推荐达人 Banner | 🟡 E6 |
| 列表卡片 | 头像 · 昵称 · 领域标签(星座/塔罗/命理/情感)· 评分 · 价格起 · 在线状态 | ✅ E1 类型 + 🟡 UI |
| 详情页 | 简介 · 服务项(文字/语音/连麦)· 评价 · 下单 CTA | ✅ E1 |
| 会话页 | 聊天/通话 UI · 倒计时/计费 | 🟡 E6 |
专家类型 ✅ E1:星座专家 · 塔罗师 · 命理师 · 心理/情感达人。
---
## STEP 2 — Feature Analysis
| 元素 | 点击 | 支付 | 评价 | 举报 |
|---|---|---|---|---|
| 达人卡 | 详情 | — | — | — |
| 文字咨询 | 下单→会话 | 是 | 结束后 | 是 🔵 |
| 语音/连麦 | 权限+下单 | 是 | 是 | 是 🔵 |
| 收藏达人 | Toggle | — | — | — 🟡 |
| 筛选排序 | 刷新列表 | — | — | — |
撮合:推荐排序 · 平台抽成 ✅ E1。
---
## STEP 3 — User Flow
```text
在线 → 浏览/搜索/筛选 → 达人详情
→ 选服务方式 → 创建订单 → 支付
→ 等待接单 → 服务中 → 结束 → 评价 → 复购
失败:支付取消/失败;达人拒单;超时退款;权限拒绝麦克风
```
---
## STEP 4 — 状态机(订单视角)
Created → Paying → Paid → Matched → InService → Completed → Reviewed
旁路:Cancelled · Refunding · Refunded · Dispute
前端页映射:列表 Loaded/Empty · 详情 · Checkout · Waiting · Chatting · Call · Rate。
---
## 达人供给运营(后台推导)🔵
入驻审核 · 培训激励 · 测测达人版工具 · 服务质量监控 · 分佣配置。
@@ -0,0 +1,61 @@
# 05 · Tab「我的」逆向设计
> Evidence: ✅ E1 资产分层 · 菜单项 🟡【待真机补全文案】
---
## STEP 1 — UI Analysis
| 区域 | 元素 | 证据 |
|---|---|---|
| 头部 | 头像 · 昵称 · 会员标识 · 编辑资料 | ✅ E1 账号体系 |
| 资产摘要 | 会员状态 · AI 剩余次数 · 积分/等级 🟡 | ✅ E1 + 🟡 |
| 功能列表 | 生命档案 · 测试/报告库 · AI 对话历史 · 订单 · 会员中心 · 收藏 · 设置 · 客服 | ✅ E1 §5 + 🔵 |
| 其它 | 达人入驻入口? · 关于/协议 | 🟡 E6 |
---
## STEP 2 — Feature Analysis
| 入口 | 作用 | 点击 | 编辑/删除 | VIP |
|---|---|---|---|---|
| 生命档案 | Self/Other 管理 | 列表/编辑 | 是 | — |
| 测试记录 | 历史量表 | 报告详情 | 可能删 | 深度报告 |
| 报告库 | 星盘/合盘/AI 报告 | 打开 | 收藏 | 解锁态 |
| AI 历史 | 会话列表 | 进「问」 | 删会话 | — |
| 会员中心 | 订阅管理 | 购买/管理自动续费 | — | — |
| 订单 | 咨询/商城/解锁 | 详情/退款入口 | — | — |
| 设置 | 账号安全/通知/隐私 | 子页 | 注销 | — |
| 分享邀请 | 裂变 | 邀请码/海报 | — | — 🟡 |
---
## STEP 3 — User Flow
```text
我的 → 点档案 → 编辑生日/关系
我的 → 会员 → 选套餐 → 支付 → 权益生效
我的 → 订单 → 售后/发票【待真机】
失败:登录态丢失;支付中断;注销二次确认
```
---
## STEP 4 — 状态机
GuestMine(引导登录)· Loading · Loaded · VIPActive · VIPExpired · Error
会员角标与首页权益 Tip 联动 🔵。
---
## 会员定价前端展示(必须完整)✅ E1
| 套餐 | 价格 |
|---|---|
| 首月 | ¥9.9 |
| 续订月 | ¥25/月 |
| 连续包季 | ¥58/季(约 ¥19.3/月) |
| 连续包年 | ¥178/年(约 ¥14.8/月) |
权益文案:完整测评报告 · AI 次数扩展 · 专属内容 ·(历史含去广告)✅ E1。
@@ -0,0 +1,104 @@
# 06 · 工具域:星座 · 星盘 · 合盘 · 运势
> Evidence: ✅ E1/E2 入口与合盘指数 · ✅ E3 盘型列表 · 社交合盘 🟡【待真机】
---
## STEP 1 — 页面家族
| 页面 | 主要 UI | 证据 |
|---|---|---|
| 星座频道 | 十二星座列表/今日运势流 | ✅ E4 |
| 本命星盘 | 圆形星盘 · 行星列表 · 宫位 · 档案切换 · 添加档案 | ✅ E3 操作步骤 |
| 盘型选择 | 多盘型工具(报道称对标多软件、约 20 种) | ✅ E3 |
| 运势 | 日/周/月/年(及一生类报告) | ✅ E3 |
| 缘分合盘 | 双人选择 · 指数 · 多盘型 Tab | ✅ E2/E3 |
| 合盘社交 | 附近的人 / 好友连线 | 🟡 E3/行业 |
### 合盘盘型(前端 Tab 级)✅ E3
| 盘型 | 说明(产品侧) |
|---|---|
| 比较盘 | 双盘叠合与跨盘相位 |
| 组合盘 | 中点关系盘 |
| 时空盘 | 时刻/坐标中点再排盘 |
| 马克斯盘(马克思盘) | 时空×本命中点视角 |
| 组合推运等 | 次限/推运变体 |
另:行运盘、三限盘、月亮返照等出现在星盘工具描述中 ✅ E3。
---
## STEP 2 — Feature Analysis
| 元素 | 作用 | 交互 | VIP |
|---|---|---|---|
| 档案切换 | 换本命主体 | 顶栏切换/添加 | — |
| 星盘图 | 可视化 | 点行星看释义 | 详解付费 |
| 相位表 | 关系动力 | 列表/点击 | 完整表会员 |
| 恋爱/友情/婚姻指数 | 缘分量化 | 结果页大数字 | 指数免费/解读付费 🟡 |
| 盘型 Tab | 切换算法视图 | 不重复支付同报告 🟡 | 深文案付费 |
| 推运日期 | 次限 as_of | 日期选择器 | — |
| 分享 | 裂变 | 海报/链接 | — |
| 附近的人 | 匹配合盘对象 | 定位授权 | 隐私开关 🔵 |
---
## STEP 3 — User Flow
### 本命星盘
```text
首页「星盘」→ 默认本人盘
→ 右上切换/添加他人档案(生日等)
→ 返回切换查看
→ 可选盘型/运势/报告解锁
```
### 缘分合盘
```text
首页「缘分合盘」→ 选档案 A/B(或快速建档)
→ 生成指数 + 默认比较盘
→ Tab 切换组合/时空/马克斯/配对/推运
→ 深度解锁 / 分享
```
### 失败
缺出生时 → 上升/宫位降级提示;定位拒绝 → 仅手动选城;支付失败保留摘要。
---
## STEP 4 — 状态机(合盘报告页)
```mermaid
stateDiagram-v2
[*] --> Form
Form --> Computing: 提交
Computing --> SummaryFree: 成功
Computing --> Error
SummaryFree --> DeepLocked
DeepLocked --> DeepOpen: 支付/会员
SummaryFree --> ChartTabSwitch
ChartTabSwitch --> SummaryFree
```
---
## 数据/算法面(前端依赖)
| 输入 | 字段 |
|---|---|
| BirthInfo | date · time · place · lat/lng · tz |
| Chart | planets[] · houses · aspects · asc |
| SynastryReport | indices · charts{} · as_of |
星历与宫位制:生产级需 Swiss Ephemeris 等 🔵;Whole Sign / Placidus 等切换【待真机】。
---
## 愈心谷对齐
已实现方向:`star-profile.md` · Synastry 五主盘+推运 · 附近/邀请。
测测「约 20 种盘」未全部落地处:Spec 中保留完整清单,实现按分期标注「未交付」而非删除。
@@ -0,0 +1,115 @@
# 07 · 工具域:测评 · 塔罗 · 沙盘 · 心情小镇 · 趣味玩法
> Evidence: ✅ E1/E2 · 流程细节 🟡/🔵
---
## A. MBTI / I人E人 ✅ E1/E2
### STEP 12
| UI | 交互 |
|---|---|
| 介绍页 · 开始测 | 进入答题 |
| 题目卡 · 进度条 | 单选;可返回上一题 🟡 |
| 结果页:16 型标签 · 维度图 · 解读 | 分享强引导;邀请好友对照关系类型 ✅ E2 |
| 付费墙 | 完整报告 |
学术背书:心言心理组修订量表、期刊《心理学进展》✅ E1(专业性证据,非 UI)。
### Flow
```text
开始 → N 题 → 提交 → 计分 Loading → 结果 → 分享/解锁/再测/双人对照
```
状态:Answering · Submitting · ResultFree · ResultLocked · ShareSheet。
---
## B. AI 玩法广场 ✅ E1
UGC 小应用集市(非官方智能体矩阵)。
| UI | 说明 |
|---|---|
| 列表 | 名 · 热度 · 创作者 |
| 应用页 | 互动表单/对话 → 结果 |
| 创作入口 | 达人/用户「手搓」【待真机是否 C 端开放】 |
示例应用:SBTI、答案之书、三生三世你和 Ta、灵魂伴侣。
审核:上架前内容审核 🔵;违规下架。
---
## C. 3D 心理沙盘 ✅ E1/E2
| UI | 交互 |
|---|---|
| 3D 场景画布 | 拖放沙具/排序 |
| 主题模板 | 职场焦虑等场景引导 |
| AI 投射分析 | 生成解读 |
| 保存/分享 | 场景快照 |
数据:超 1200 万用户口径 ✅ E1。权限:可能陀螺仪/性能降级 🔵。
---
## D. AI 心情小镇 ✅ E1
| UI | 交互 |
|---|---|
| 角色选择 | ~6 人设(知心姐姐、理性学长、明朗…) |
| 对话/互动 | OCR · 情感识别 |
| 沉浸场景 | 小镇视觉 |
边界:轻度情绪;中重度转真人/专业机构 ✅ E1。
---
## E. 塔罗 ✅ E3
抽牌(单牌/三牌/阵)→ AI/达人解读 → 可提问;可能拍照识牌 🟡。
结果页:牌义 · 组合 · 建议 · 付费扩展。
---
## F. 命理工具箱 ✅ E3
八字(四柱/五行/大运/流年)· 紫微 · 姓名五格 · 二十八宿 · 生命数字。
前端:表单(姓名/生日)→ 盘面/条文 → 解锁。
---
## G. 「更多」趣味测 ✅ E2
| 名称 | 用途 |
|---|---|
| 爱情树 | 依恋类型 |
| 幸运地图 | 幸运/桃花城市等 |
| pick 卡 | 趣味抽取 |
Flow 同轻量测评:介绍 → 互动 → 结果 → 分享。
---
## H. 每日心情 / 打卡 🟡 E1 留存叙述
入口可能在首页或陪伴场景;打卡日历 · 情绪曲线 · 驱动晚间打开(50% 用户 19:00 后 ✅ E1)。
---
## 统一测评状态机
```mermaid
stateDiagram-v2
[*] --> Intro
Intro --> InProgress
InProgress --> Scoring
Scoring --> ResultTeaser
ResultTeaser --> Paywall
Paywall --> ResultFull
ResultTeaser --> Share
Scoring --> Error
```
@@ -0,0 +1,232 @@
# 08 · 横切系统逆向(STEP 5–18)
> 支撑前端全功能的数据 / API / 后台 / 运营 / 安全推导
> 标记:无公开 UI 的条目多为 🟡/🔵,但**禁止省略整类**
---
## STEP 5 — 数据模型(核心对象)
| 对象 | 关键字段(类型) | 可空 | 默认 | 来源 | 缓存 | 索引 | 证据 |
|---|---|---|---|---|---|---|---|
| User | id UUID PK · phone · wx_openid · status · created_at | 部分 | active | 注册 | Redis session | phone unique | ✅ E1 |
| Profile | id · user_id · relation(self/other) · display_name · birth_date · birth_time · birth_place · geo_* · tags JSON | time/place 可空 | — | 建档 | 本地+服务端 | user_id | ✅ E1 |
| BirthInfo | 可内嵌 Profile | — | tz=CST+8 🟡 | — | — | — | 🟡 |
| AstrologyChart | profile_id · jd · planets JSON · houses JSON · system · version | — | — | 计算服务 | 按 profile+ver | profile_id | 🔵 |
| SynastryReport | id · profile_a · profile_b · indices JSON · charts JSON · as_of | — | — | 合盘 | 报告缓存 | (a,b) | ✅ E3 |
| TestDefinition | slug · title · questions JSON · scoring | — | published | CMS | CDN | slug | ✅ E1 MBTI |
| TestRecord | user_id · test_id · answers · result · share_code | — | — | 提交 | — | user_id | ✅ E2 |
| AIConversation | id · user_id · profile_ctx_id · mode · messages | — | — | 问 | 热数据 | user_id | ✅ E1 |
| AIQuota | user_id · remaining · period | — | 免费额 | 会员 | Redis | user_id | ✅ E1 |
| Expert | id · domains[] · price_text · price_voice · score · online | — | — | 达人平台 | 列表缓存 | domain | ✅ E1 |
| ConsultOrder | id · user_id · expert_id · mode · amount · status | — | created | 下单 | — | status | ✅ E1 |
| Membership | user_id · plan · status · expires_at · auto_renew | — | — | 订阅 | — | expires | ✅ E1 |
| Order | id · kind(membership/unlock/consult/shop) · amount_cents · status | — | — | 支付 | — | user_id | ✅ E1 |
| Notification | id · user_id · channel · type · payload · read_at | — | — | 推送/站内 | — | user_id,read | ✅ E4 |
| PlazaApp | id · creator_id · title · heat · status | — | pending | UGC | 热榜 | heat | ✅ E1 |
| Favorite | user_id · target_type · target_id | — | — | 收藏 | — | uniq | 🟡 |
| Coupon | id · rules JSON | — | — | 运营 | — | — | 🔵 |
| OperationLog | actor · action · meta | — | — | 后台 | 冷存 | time | 🔵 |
| ABAssignment | user_id · exp_key · bucket | — | — | 配置 | Redis | — | 🔵 |
---
## STEP 6 — 数据库设计(表清单)
必表(前端可感知数据):
`users` · `device_identities` · `profiles` · `growth_reports` / `synastry_reports` · `test_definitions` · `test_records` · `ai_conversations` · `ai_messages` · `ai_quotas` · `experts` · `consult_orders` · `memberships` · `orders` · `payments` · `notifications` · `plaza_apps` · `favorites` · `banners` · `feature_flags` · `audit_logs`
每表要求:PK UUID · `created_at`/`updated_at` · 软删 `deleted_at` · 外键 ON DELETE 策略明确 🔵。
合盘邀请示例:`synastry_invites(token unique, host_profile_id, expires_at, report_id)` 🔵(愈心谷已落地相近结构)。
---
## STEP 7 — API Reverse Engineering(可开发级草案)
> Path 为 🔵 工程命名;真实测测 Path【待抓包】
| Method | Path | 权限 | Request | Response 要点 | 错误码 |
|---|---|---|---|---|---|
| POST | /auth/login | 公网 | phone/wx | token · user | 401 |
| GET | /profiles | 登录 | — | items[] | — |
| POST | /profiles | 登录 | birth_* · relation | profile | 400 |
| PATCH | /profiles/:id | 所有者 | patch | profile | 404 |
| POST | /tests/:slug/submit | 登录 | answers | record_teaser · record_id | 429 |
| GET | /reports/:id | 所有者 | — | summary · detail? | 403 detail |
| POST | /astrology/natal | 登录 | profile_id | chart | 400 |
| POST | /astrology/synastry | 登录 | a · b · as_of | report | 400 |
| GET | /astrology/nearby | 登录+geo | lat,lng,r | items | 403 |
| POST | /ai/chat | 登录+额度 | message · profile_ctx · deep | stream SSE | 402 额度 |
| GET | /ai/conversations | 登录 | cursor | list | — |
| GET | /experts | 登录 | filter | list | — |
| POST | /consult/orders | 登录 | expert · mode | order | 402 |
| POST | /consult/orders/:id/pay | 登录 | channel | pay_params | 409 |
| GET | /membership/me | 登录 | — | plan · expires | — |
| POST | /orders | 登录 | kind · plan/report | order_id | — |
| GET | /messages | 登录 | cursor | items · unread | — |
| POST | /messages/:id/read | 登录 | — | ok | — |
| GET | /plaza/apps | 登录 | sort=heat | apps | — |
| POST | /plaza/apps/:id/run | 登录 | input | result | 403 审核 |
RateLimit:AI/支付严格限流;图表计算按用户 QPS 🔵。
Cache:星盘按 profile+ephemeris_ver;广场热榜 Redis ZSETBanner CDN。
Retry:幂等键用于支付与咨询下单。
---
## STEP 8 — 后台运营系统
| 模块 | 能力 | 证据 |
|---|---|---|
| Banner/运营位 | 首页头图、弹窗、闪屏 | 🔵 |
| 推荐位 | 达人/测试/文章排序 | 🟡 |
| 内容审核 | 广场 UGC、社区帖、达人资质 | 🔵 |
| 用户管理 | 封禁、注销、投诉 | 🔵 |
| 订单/退款 | 咨询与会员 | ✅ E1 商业 |
| 会员配置 | 价格、权益、首月优惠 | ✅ E1 |
| 活动配置 | 裂变、优惠券 | 🟡 |
| 推送 | 模板、人群包 | 🔵 |
| 统计看板 | DAU、转化漏斗、AI 次数 | 🔵 |
| AB / 配置中心 | 引导问题文案、价格实验 | 🔵 |
| 达人运营 | 入驻审核、分佣、培训 | ✅ E1 达人版 |
---
## STEP 9 — 权限矩阵
| 角色 | 能 | 不能 |
|---|---|---|
| 游客 | 浏览部分首页、部分测评 | AI 深度、咨询、发帖 |
| 登录用户 | 档案、基础 AI 次数、下单 | 未购深度 detail |
| VIP/会员 | 扩容 AI、完整报告、专属内容 | 后台 |
| SVIP | 🟡 若存在更高等级 | — |
| 达人 | 接单、达人工具 | 改平台分佣 |
| 运营 | CMS、活动、推荐 | 直接改支付流水 |
| 审核员 | 通过/驳回 UGC/达人 | 财务 |
| 客服 | 工单、补发权益 | 删库 |
| 管理员 | 配置与账号 | — |
| 超管 | 全量 | — |
前端:`LoginRequired` · `VIPLocked` · `PermissionDenied`
---
## STEP 10 — 支付系统
状态:Created → Paying → Paid / Failed / Cancelled →(退款)Refunding → Refunded
场景:重复支付防重 · 补单对账 · 咨询未接单自动退 · 风控限额 · 发票 🔵
渠道:IAP / 微信 / 支付宝 🟡【待真机】
前端:收银台 · 结果页 · 订单详情入口(我的)。
---
## STEP 11 — 消息系统
| 通道 | 用途 |
|---|---|
| Push | 达人回复、会员到期 |
| 站内信 | 消息 Tab |
| 短信 | 登录验证码 |
| 邮件 | 可选账单 🔵 |
| 角标 | Tab 未读聚合 |
策略:免打扰时段 · 营销推送开关 · AI 主动触达(公开称尚未强做)✅ E1。
---
## STEP 12 — 埋点
| 事件 | 触发 |
|---|---|
| page_view | 各 Tab/工具 |
| home_grid_click | 宫格 |
| test_start / test_complete / test_share | 测评 |
| ask_send / ask_deep_toggle / ask_switch_profile | 问 |
| ask_switch_human | 转真人 |
| synastry_complete / chart_tab_switch | 合盘 |
| expert_view / consult_pay | 在线 |
| membership_pay | 会员 |
| plaza_app_open | 广场 |
| error_api | 异常 |
漏斗:曝光 → 建档 → AI → 会员 → 咨询。停留时长、次日留存 🔵。
---
## STEP 13 — 配置系统
| 项 | 后台可配 | 写死 | 远程/灰度/AB |
|---|---|---|---|
| 宫格顺序/显隐 | ✓ | — | 灰度 |
| AI 引导问题 | ✓ | — | 按来源 AB ✅ E1 建议 |
| 会员价格 | ✓ | — | AB |
| 星历版本 | — | 逻辑 | 远程 flag |
| 审核词库 | ✓ | — | — |
| 功能开关(沙盘) | ✓ | — | 灰度 |
---
## STEP 14 — 缓存策略
| 层 | 内容 |
|---|---|
| 本地 | 档案草稿、会话草稿、最近报告摘要 |
| Redis | Session、AI 额度、热榜、限流 |
| CDN | 图片、静态运营配置 |
| 计算缓存 | 同档案星盘 TTL |
| 分页 | 信息流 cursor |
---
## STEP 15 — 异常处理(前端必达)
断网 · 弱网 · 超时 · 重复点击(按钮 loading)· Token 失效 · 本地数据损坏清缓存 · 强制升级 · 审核失败文案 · 404 资源 · 支付结果未知查单 · SSE 中断续传 🔵。
---
## STEP 16 — 日志
用户行为(隐私脱敏)· 前端错误 JS · API access · 支付 · 审核 · 运营操作 · 安全(登录失败/风控)🔵。
保留与销毁策略合规 🔵。
---
## STEP 17 — 安全
| 项 | 要求 |
|---|---|
| 权限 | 服务端强制 detail 剥离(不仅藏 UI) |
| 注入/XSS | 内容安全渲染 |
| CSRF/重放 | 支付与关键写接口 |
| 验证码 | 登录/敏感操作 |
| 风控 | 刷单、恶意咨询 |
| 设备 | device_key / 绑定 |
| 隐私 | geo 默认不可见;档案分享最小化 |
| 心理边界 | 危机话术与转介 |
遵守应用商店与网信/心理相关合规 🔵。
---
## STEP 18 — 可扩展性
| 方向 | 策略 |
|---|---|
| 新盘型 | charts 插件注册,API 加 mode |
| 新测评 | TestDefinition 配置化 |
| 新 AI 子场景 | Ask 内 slot,避免新 Tab |
| 多端 | 同一 BFF;小程序裁剪 Marketplace |
| API 兼容 | summary schema version 字段 |
| 模块解耦 | 计算服务与业务 API 分离 |
| 硬件(巴布) | 独立产品线,账号体系统一 ✅ E1 |
---
## Completeness 自检(STEP 518
- [x] 数据模型 / 库表 / API 草案
- [x] 后台 / 权限 / 支付 / 消息 / 埋点
- [x] 配置 / 缓存 / 异常 / 日志 / 安全 / 扩展
- [ ] 真实抓包字段级对齐【待补证】
@@ -0,0 +1,90 @@
# 测测 App 前端逆向工程设计文档(V1.0)
> Status: `Active` · Method: [reverse-engineering-spec.md](../../../design/reverse-engineering-spec.md)
> Scope: **前端可见能力 + 为支撑前端所必需的后台/数据/运营推导**
> 目标:Production / Enterprise / Feature Complete 级设计输入(非 Demo
---
## 0. 任务声明
| 项 | 内容 |
|---|---|
| 身份 | Senior Reverse Engineering Architect |
| 目标 App | 测测(CeCe / 测测星盘,心言集团) |
| 方法 | 逆向工程,非「设计一个类似 App」 |
| 禁止 | Demo · MVP 终态 · 「略 / TODO / 以后再做」糊弄 |
**落地到愈心谷时**:能力可完整对标;用户可见命名与禁词服从 [`lexicon.md`](../../lexicon.md);禁止自称「测测」、照搬商标视觉。
---
## 1. 证据来源总表(Evidence First
| ID | 来源 | 类型 | 日期/版本线索 |
|---|---|---|---|
| E1 | [人人都是产品经理 · 测测深度体验报告](https://www.woshipm.com/evaluating/6391148.html) | ✅ UI/行为证据(含实测截图描述) | 2026-05-09 |
| E2 | [中华网 · 测测功能图谱](https://tech.china.com/articles/20250417/202504171661508.html) | ✅ 行为/产品证据 + 🟡 运营口径 | 2025-04 |
| E3 | 应用商店/下载站功能介绍(星盘工具列表等) | ✅ 功能列表证据(版本可能滞后) | ~10.x 描述 |
| E4 | 本仓 [`cece-feature-map.md`](../../cece-feature-map.md) | 🟡 既有归纳 | 持续 |
| E5 | 本仓 [`apps/docs/analysis/cece-teardown.md`](../../../../apps/docs/analysis/cece-teardown.md) | 🟡 映射分析 | 历史 |
| E6 | 行业惯例 / 同类 App | 🟡 推断 | — |
| E7 | 工程完整性补充 | 🔵 工程建议 | — |
| E8 | 安卓模拟器 AVD `YuXinGu_API34` + APK 10.50.0 截图/UI dump | ✅ 真机 UI 证据 | 2026-08-03 |
> **局限**:无未公开 DAU/后台;HTTPS 抓包未做。E8 明细见 [complete-design/evidence-20260803.md](complete-design/evidence-20260803.md)。
---
## 2. 文档地图
| 文档 | 内容 | Workflow 覆盖 |
|---|---|---|
| [00-overview.md](00-overview.md) | L0 IA · 全功能清单 · 全局状态 · 导航 | STEP 1–4 全局 |
| [01-tab-home.md](01-tab-home.md) | 首页(宫格/信息流/建档/玩法广场) | STEP 1–4 |
| [02-tab-message.md](02-tab-message.md) | 消息 | STEP 14 |
| [03-tab-ask.md](03-tab-ask.md) | 「问」测测 AI + 真人 1v1 | STEP 14 |
| [04-tab-online.md](04-tab-online.md) | 在线(达人 Marketplace | STEP 14 |
| [05-tab-mine.md](05-tab-mine.md) | 我的 | STEP 14 |
| [06-tools-astrology.md](06-tools-astrology.md) | 星座 · 星盘 · 合盘 · 运势 | STEP 1–4 + 算法面 |
| [07-tools-tests-psych.md](07-tools-tests-psych.md) | MBTI · 塔罗 · 沙盘 · 心情小镇 · 趣味测 | STEP 1–4 |
| [08-systems.md](08-systems.md) | 数据/库/API/后台/权限/支付/消息/埋点/配置/缓存/异常/日志/安全/扩展 | STEP 518 |
| **[complete-design/](complete-design/README.md)** | **完整产品设计包(Design Complete** — 实现与模拟器校验前的唯一前端设计输入 | 定稿升格 |
---
## 3. Completeness Checklist(套件级)
- [x] 五 Tab 页面拆解
- [x] 首页宫格与「更多」工具域
- [x] AI / 达人双轨
- [x] 星盘与合盘工具面
- [x] 测评 / 沉浸体验
- [x] 横切系统 STEP 518
- [ ] 【待真机补证】逐按钮热区坐标与最新版 UI 差分
- [ ] 【待抓包补证】真实 API Path / 字段级 Response
套件可结束条件:上表「真机/抓包」两项未完成时,仍可作为 **Feature Complete 设计底稿**;实现前须补证据或接受 🟡/🔵 风险。
**完整设计定稿:** [complete-design/](complete-design/README.md) 已将 🟡/🔵 升格为设计定稿(D);真机/模拟器差分按 [99-emulator-validation.md](complete-design/99-emulator-validation.md) 回填。
---
## 4. 愈心谷映射入口
| 测测前端域 | 愈心谷当前落地 | Spec |
|---|---|---|
| 档案 / 了解 TA | Profile | `profile.md` |
| 问 / AI | Ask | `ask.md` |
| 星座 / 星盘 / 合盘 | Star + Synastry | `star-profile.md` |
| 测评 | Explore / Scale | `explore-test.md` |
| 会员 | Membership | `membership.md` |
| 消息 / 在线达人 | 分期后置 | feature-map `[P3]/`/`[No]` |
---
## 5. 维护
- 版本变更:在各文档顶部追加「差分日志」
- 真机补证:把 ✅ 行从 E1 升级为「真机 YYYY-MM-DD + 版本号」
- 与 [`cece-feature-map.md`](../../cece-feature-map.md) 保持 L0 一致;冲突时以本套件 + 更新证据为准
@@ -0,0 +1,150 @@
# 00 · 设计圣经(全局)
> Design ID: `CECE-FE-BIBLE-V1` · 定稿 · 待模拟器校验项见文末
---
## 1. 产品一句话
以趣味测评与星盘档案为入口,以「问」Tab 级 AI(挂档案)为战略核心,以达人咨询为高客单转化,以会员订阅为主营收的泛心理情感陪伴 App。
---
## 2. 信息架构(冻结)
### 2.1 底部五 TabD 定稿)
| 序 | Tab | 路由 key | 视觉(✅ E8 10.50.0 | 战略 |
|---|---|---|---|---|
| 1 | 首页 | `home` | 标准 | 发现与工具分发 |
| 2 | 消息 | `message` | 标准 + 未读数字角标 | 触达与会话入口 |
| 3 | **问** | `ask` | **中央大圆突出 + AI 角标** | 唯一 Tab 级官方 AI |
| 4 | 在线 | `online` | 标准 + 运营角标「限免」(可配) | 达人 Marketplace |
| 5 | 我的 | `mine` | 标准;游客文案「未登录」 | 资产与商业 |
规则:
- 禁止再增加第 6 个主 Tab。
- 灵犀/小智/灵魂伴侣/心情小镇 **不得**升为底部 Tab;一律挂「问」或首页宫格。
- 「问」内顶栏固定双轨:`测测AI` | `真人1v1`
### 2.2 全局导航栈
```text
RootTabNavigator
├── HomeStack
├── MessageStack
├── AskStack ← 中央按钮切到此栈
├── OnlineStack
└── MineStack
Modal 层:Login · MembershipPaywall · ShareSheet · SystemPermission · ForceUpdate
```
---
## 3. 全局组件目录(前端必须实现)
| 组件 | 职责 | 出现位置 |
|---|---|---|
| `AppTabBar` | 五 Tab;问中间凸起 | 全局 |
| `ProfileSwitcher` | 自己/TA 档案切换 | 问、星盘、合盘 |
| `BirthArchiveForm` | 生日/时/地/关系类型 | 建档、了解TA |
| `PaywallSheet` | 会员/单次解锁 | 报告、AI 额度 |
| `SharePosterSheet` | 结果卡分享 | 测评、合盘、星盘 |
| `NetworkBanner` | 离线/弱网 | 全局 |
| `EmptyState` | 空列表 CTA | 消息、订单、档案 |
| `ErrorRetry` | 失败重试 | 全局 |
| `StreamingBubble` | AI 流式回复 | 问 |
| `ExpertCard` | 达人列表项 | 在线 |
| `ChartWheel` | 圆形星盘 | 星盘/合盘 |
| `IndexScoreRow` | 恋爱/友情/婚姻指数 | 合盘 |
| `GridIcon` | 首页宫格 | 首页 |
| `FeedCard` | 信息流卡片 | 首页 |
| `PlazaAppCard` | 玩法广场项 | 广场 |
| `UnreadBadge` | 角标 | 消息 Tab |
---
## 4. 全局状态机(App
```mermaid
stateDiagram-v2
[*] --> ColdStart
ColdStart --> Bootstrap
Bootstrap --> GuestSession
Bootstrap --> AuthedSession
GuestSession --> AuthModal: gated action
AuthModal --> AuthedSession: success
AuthedSession --> Offline
Offline --> AuthedSession
AuthedSession --> ForceUpdate: version low
AuthedSession --> Paywall: vip gate
Paywall --> AuthedSession
```
全局枚举:`ColdStart` · `Bootstrap` · `GuestSession` · `AuthedSession` · `AuthModal` · `Offline` · `ForceUpdate` · `Paywall` · `FatalError`
---
## 5. 设计令牌(结构约定 · 非抄视觉品牌)
> 模拟器采集后可替换为实测色值;此处只定 **语义角色**
| Token | 角色 |
|---|---|
| `--color-brand` | 主操作/问 Tab 强调 |
| `--color-ai` | AI 标识色 |
| `--color-vip` | 会员金色系 |
| `--color-danger` | 错误/删除 |
| `--color-surface` | 卡片底 |
| `--color-feed-bg` | 信息流底 |
| `--radius-card` | 1216 |
| `--tab-ask-size` | 中央按钮直径 > 其它 Tab |
动效:Tab 切换 200ms;AI 流式打字;宫格按下缩放 0.96。
---
## 6. 档案为中心的产品定律(D 定稿)
1. 所有深度解读默认绑定 **当前 Profile**
2. 「问」必须支持切换到 **关系档案 TA**
3. 首页持续引导「了解 TA」建档。
4. 合盘/匹配最少需要 2 份档案(可快速创建)。
5. 无出生时:上升/宫位降级提示,不阻断太阳解读。
---
## 7. 商业门禁(前端表现)
| 能力 | 游客 | 登录免费 | 会员/深购 |
|---|---|---|---|
| 浏览首页/部分测评 | ✓ | ✓ | ✓ |
| 完整测评报告 | teaser | teaser | ✓ |
| AI 对话 | 登录后有限次 | 有限次 | 扩容 |
| 合盘指数 | — | ✓ | ✓ |
| 合盘完整相位/推运文案 | — | teaser | ✓ |
| 达人咨询 | — | 可下单 | 可下单 |
| 玩法广场基础 | ✓ | ✓ | 视应用 |
价格文案(展示用,采集后校验):首月 ¥9.9 · 月 ¥25 · 季 ¥58 · 年 ¥178。
---
## 8. 文案与合规(前端)
- 危机内容:拒答模板 + 热线/转真人。
- 免责:探索/娱乐向声明(具体措辞模拟器采集竞品后对齐,愈心谷落地另走 lexicon)。
- 未成年人:系统账号年龄门 + 功能裁剪(D:咨询与付费加强校验)。
---
## 9. 待模拟器校验清单(圣经级)
| ID | 校验项 |
|---|---|
| V-B01 | 五 Tab 文案与「问」视觉权重 |
| V-B02 | 全局弹层种类(登录/会员/分享) |
| V-B03 | 会员价与权益文案 |
| V-B04 | 主色/AI 色实测 |
| V-B05 | 游客可点范围 |
@@ -0,0 +1,199 @@
# 10 · 首页完整设计
> Route: `/home` · Tab: 首页 · Design Complete
---
## 1. 页面目标
1. 分发工具(宫格)
2. 推动建档(了解 TA
3. 消费信息流 / 转化测评与会员
4. 承接 UGC 玩法广场
---
## 2. UI 完整清单(分区)
### 2.1 顶区 `HomeHeader`(✅ E8
| 元素 ID | 类型 | 文案/内容 | 行为 |
|---|---|---|---|
| H-HDR-CHECKIN | IconBtn | 签到 | → 签到/每日福利 |
| H-HDR-SEARCH | Search | 运营占位轮播(例「锐评十二星座」) | → 全局搜索 |
| H-HDR-PLUS | IconBtn | `+` | → 发布/快捷创建(待子页核对) |
| H-BANNER-TA | 条 | 「输入生日,更加了解TA」 | → 建档 other |
### 2.2 自己卡片 `HomeSelfCard`(✅ E8 · 原「档案条」升格)
| 元素 | 行为 |
|---|---|
| 标题「自己」+「更多」 | 更多 → 档案/运势详情 |
| 今日心情分数 + 短解读 | 点卡片进入心情/运势 |
| 五维条:爱情 / 财富 / 事业 / 学习 / 人际 | 展示型;点击进详情(待核) |
### 2.3 宫格 `HomeToolGrid`(✅ E8 真机 10.50.0 定稿)
横向两行可滑宫格(非 3×3):
| 行 | 序 | key | 标题 | 备注 |
|---|---|---|---|---|
| 1 | 1 | mbti | I人E人 | |
| 1 | 2 | star_sign | 星座 | |
| 1 | 3 | natal | 星盘 | |
| 1 | 4 | bazi | 生辰 | |
| 1 | 5 | synastry | 缘分合盘 | |
| 1 | 6 | ziwei | 紫微 | 滑出可见 |
| 2 | 7 | companion_star | 陪伴小星 | |
| 2 | 8 | confide | 倾诉 | |
| 2 | 9 | wisdom_card | 智慧卡 | |
| 2 | 10 | natal_report | 星盘报告 | 角标 New |
| 2 | 11 | bazi_cal | 生辰历 | |
| 2 | 12 | soulmate | 灵魂伴侣 | 滑出可见 |
宫格下方运营双卡(非第十格):
| key | 标题 | 说明 |
|---|---|---|
| plaza | AI玩法广场 | 大卡 + 运营副文案 |
| shop_promo | 商城运营卡 | 例:水晶手串 |
| ai_disclaimer | 脚注 | 「部分标题由AI生成,仅供参考」 |
「更多」入口:在「自己」卡片标题旁 / 工具二级页(见 `free2/tools/更多.png`);沙盘等未进首屏宫格的工具收入更多页。
### 2.3.1 「更多」页条目(✅ E8 `free2/tools/更多.labels.txt`
分组实机可见(不完全等于 UI 分区文案):
| 类 | 条目 |
|---|---|
| 内容/玩法 | 推荐 · 测试 · 心情小镇 · 幸运地图 · 爱情树 · 聊天分析 · 关系网 · 解读 · 沙盘 · 星骰 · 智慧卡 · 日历 |
| 命理工具 | 星盘 · 星盘报告 · 缘分合盘 · 星座 · 生辰 · 生辰历 · 紫微 · 紫微历 · 星宿 · 政余 · 政余历 · 灵数 · 生肖 · 玛雅图腾 · 人类图 |
| 社交/商业 | 倾诉 · 灵魂伴侣 · 商城 |
### 2.4 运营位 `HomePromo`
- 最多 1 个大 Banner(可关闭,24h 不再展示,本地记录)
- 配置来自后台 `banners`
### 2.5 信息流 `HomeFeed`
| 卡片类型 | 字段 | 点击 |
|---|---|---|
| fortune_today | 标题、摘要、分数 | 运势详情 |
| hot_test | 封面、标题、人数 | 测评 |
| expert | 达人卡 | 达人详情 |
| article | 封面、标题 | 文章 |
| video | 封面 | 播放 |
| plaza_hot | 应用名、热度 | 广场应用 |
| ai_entry | 文案 | → 问 |
交互:下拉刷新 · 上拉分页(cursor)· 负反馈「不感兴趣」(可选)。
### 2.6 「更多」二级页 `ToolsMorePage`
固定收录(可后台排序):爱情树、幸运地图、pick卡、塔罗、八字、紫微、生命数字、姓名分析…
每项:Icon · 标题 · 副标题 · 角标(热/新)。
### 2.7 AI 玩法广场 `PlazaPage`
| 元素 | 说明 |
|---|---|
| 标题区 | Slogan:「全民手搓创意——精选应用」 |
| 排序 | 热度 / 最新 |
| AppCard | 名、热度、创作者、封面 |
| 点击 | → `PlazaAppRuntime` |
| 空态 | 「暂无应用」 |
| 审核中 | 创作者端可见,C 端不可见 |
---
## 3. 交互细则
| 手势 | 对象 | 结果 |
|---|---|---|
| Tap | 宫格 | 路由跳转,埋点 `home_grid_click` |
| Tap | 了解 TA | 打开建档;未登录先 Auth |
| LongPress | 宫格 | D)无菜单,防误触 |
| Pull | Feed | 刷新 |
| Tap | Feed 负反馈 | 减少同类(需登录) |
倾诉点击:弹出 ActionSheet「和 AI 聊」/「找达人」→ ask / online。
---
## 4. 状态机
| 状态 | UI |
|---|---|
| Loading | Header 骨架 + 宫格骨架 + Feed 骨架 |
| Ready | 全量 |
| FeedEmpty | 宫格在,Feed EmptyState |
| Offline | NetworkBanner,缓存宫格可点 |
| Error | 全页 Retry |
| AuthRequired | AuthModal |
```mermaid
stateDiagram-v2
[*] --> Loading
Loading --> Ready
Loading --> Error
Ready --> AuthRequired
Ready --> Offline
Offline --> Ready
Error --> Loading
```
---
## 5. 接口契约(本页)
| 调用时机 | API |
|---|---|
| 进入 | `GET /v1/home/bootstrap` → grid_config · banners · profile_summary |
| Feed | `GET /v1/home/feed?cursor=` |
| 负反馈 | `POST /v1/home/feed/{id}/dismiss` |
| 广场 | `GET /v1/plaza/apps?sort=heat` |
`home/bootstrap` Response(定稿):
```json
{
"profile_summary": {"id":"","name":"","sun_sign":"","has_birth_time":false},
"grid": [{"key":"mbti","title":"I人E人","badge":null,"enabled":true}],
"banners": [{"id":"","image_url":"","link":"","closable":true}],
"ta_guide_visible": true
}
```
---
## 6. 异常
| 场景 | 处理 |
|---|---|
| bootstrap 失败 | 使用本地默认宫格(写死上表 10 项)+ Error toast |
| feed 失败 | 保留宫格,Feed 区 Retry |
| 配置缺宫格 | 合并默认,不丢星盘/合盘/问相关入口 |
---
## 7. 埋点
`home_expose` · `home_grid_click{key}` · `home_ta_guide_click` · `home_feed_click{type}` · `home_feed_refresh` · `plaza_open` · `plaza_app_click`
---
## 8. 模拟器校验 ID
| ID | 项 | 状态 |
|---|---|---|
| V-H01 | 宫格文案与顺序 | ✅ E8 已按上表改稿 |
| V-H02 | 了解TA 文案 | ✅ 「输入生日,更加了解TA」 |
| V-H03 | 广场形态 | ✅ 首页双大卡而非 slogan 条 |
| V-H04 | Feed / 达人卡 | 🟡 采集中 `free/home/*` |
| V-H05 | 更多页条目 | 🟡 采集中 `free/tools/更多*` |
| V-H06 | 自己卡片五维 | ✅ 爱情财富事业学习人际 |
| V-H07 | 门禁弹层 | ✅ 未成年 / 每日领取 |
差分总表:[evidence-20260803.md](evidence-20260803.md)
@@ -0,0 +1,117 @@
# 11 · 消息完整设计
> Route: `/message` · Design Complete
---
## 1. 目标
聚合 AI / 达人 / 社区 / 系统 / 商业通知;驱动回到「问」或咨询会话。
---
## 2. UI 清单
### 2.1 顶栏(✅ E8
| ID | 元素 | 行为 |
|---|---|---|
| M-TITLE | 「消息」 | — |
| M-SEARCH | 搜索图标 | 搜会话/通知 |
| M-CLEAR | 扫帚图标 | 清理/标记已读(无「全部已读」文案) |
### 2.2 列表形态(✅ E8 · 无顶部分段)
**无** `全部|AI|达人|互动|系统` Segment;为**分组会话列表**
| 行类型 | 示例 | 角标 |
|---|---|---|
| 系统通知 | 「检测到新的登录行为…」 | 未读数字 |
| AI 助手 | 「小星」+ AI 角标 | 未读数字 |
| (登录后)达人/互动 | 待更多账号补证 | — |
底部可出系统通知引导条:「开启系统通知…」+「去开启」+ 关闭。
### 2.3 会话行 `MessageRow`
| 字段 | 说明 |
|---|---|
| avatar | 系统铃铛 / 小星 IP / 达人头像 |
| title | 会话名 |
| preview | 最后一条摘要 |
| time | 相对时间(今天时刻 / 昨天) |
| badge | 未读数 |
### 2.4 系统通知详情(✅ E8)
路由级页「系统通知」:时间分隔 + 卡片列表(纯文本 / 链接「点击查看」/ 运营富媒体)。
### 2.5 空态
插画 + 引导回「问」(未在本版截到空态)。
---
## 3. 交互
| 操作 | 结果 |
|---|---|
| Tap 行 | AI→Ask 线程;达人→ConsultSession;互动→动态/私信;系统→详情 H5;商业→会员/订单 |
| LongPress | 置顶 / 免打扰 / 删除 |
| 左滑 | 删除(iOS 风格);Android 长按菜单 |
| 下拉 | 刷新 |
---
## 4. 状态机
`Loading` · `Ready` · `Empty` · `Offline` · `Error` · `AuthRequired`
未读角标:`GET /v1/messages/unread_count` 与 TabBar 同步;前台 30s 轮询或 WS 推送(D:优先 WS,降级轮询)。
---
## 5. API
| API | 说明 |
|---|---|
| `GET /v1/messages?type=&cursor=` | 列表 |
| `POST /v1/messages/{id}/read` | 已读 |
| `POST /v1/messages/read_all` | 全读 |
| `DELETE /v1/messages/{id}` | 删会话 |
| `POST /v1/messages/{id}/mute` | 免打扰 |
| `GET /v1/messages/unread_count` | 角标 |
Message DTO
```json
{
"id": "uuid",
"type": "ai|expert|social|system|commerce",
"title": "",
"preview": "",
"avatar_url": "",
"unread": 0,
"muted": false,
"ref": {"kind":"conversation|consult|url","id":""},
"updated_at": "ISO8601"
}
```
---
## 6. 异常
推送权限拒绝:仅站内;首次提示去设置。
Token 失效:清列表进 Auth。
删除失败:Toast 回滚 UI。
---
## 7. 埋点
`message_tab_expose` · `message_open{type}` · `message_read_all` · `message_delete` · `message_mute`
## 8. 校验 ID
`V-M01` 分类形态 · `V-M02` 行字段 · `V-M03` 长按菜单项 · `V-M04` 角标规则
@@ -0,0 +1,154 @@
# 12 ·「问」完整设计(测测 AI + 真人 1v1)
> Route: `/ask` · Design Complete · 战略核心页
---
## 1. 目标
1. 以星盘档案为底座的垂直 AI 对话
2. 同页低摩擦切换真人咨询
3. 对象切换(自己/TA)扩展关系场景
4. 深度思考与子场景(灵魂伴侣等)承载差异化
---
## 2. UI 完整清单
### 2.1 顶栏 `AskTopBar`(✅ E8
| ID | 元素 | 行为 |
|---|---|---|
| A-BACK | 返回 | 回上一页/首页 |
| A-TAB-AI | 「测测AI」 | 默认选中 |
| A-TAB-HUMAN | 「真人1v1」 | 角标「新客半价」(运营可配) |
| A-MENU | 汉堡菜单 | 历史/设置;可带红点 |
### 2.2 AI 轨首屏(✅ E8 · 非纯聊天空态)
冷启动为**引导页 + 转化区**,而非空白线程:
| 区块 | 内容 |
|---|---|
| 人设问候 | 猫头鹰 IP +「Hi~我是测测AI / 最近有什么事…」 |
| 引导问题 ×4 | 整行按钮(非小芯片) |
| 真人咨询导流 | 「也可以选择真人咨询…」+「228位测测达人在线」+「去提问」 |
| 达人数量卡 | 1/3/8/15 位;「新客6折」等角标 |
| 底栏快捷 | **工具** · **语音通话** · **深度解读** · **灵魂伴侣** |
| 输入框 | placeholder「让我来解答你的问题吧」 |
| 免责声明 | 「内容由AI生成,仅供娱乐…」 |
**实测引导问题(✅ 替换原草稿)**
1. 有哪些适合我的财富建议?
2. 这份工作有发展吗?
3. 我有什么性格弱点吗?
4. 我和Ta会复合吗?
### 2.3 上下文/能力入口(✅ E8 落在底栏快捷)
| ID | 元素 | 行为 |
|---|---|---|
| A-TOOLS | 「工具」 | Sheet:星盘等工具入口 |
| A-VOICE | 「语音通话」 | 语音;可红点 |
| A-DEEP | 「深度解读」 | 深度能力(可能付费) |
| A-SOUL | 「灵魂伴侣」 | 子场景 |
对象切换/星盘维度:在工具 Sheet 或对话上下文中(待 `ask/tools-sheet` 截图补全)。
### 2.4 输入区 `AskComposer`
| 元素 | 行为 |
|---|---|
| 文本框 | placeholder 见上 |
| 发送 | 输入后出现 |
| 语音 | 底栏「语音通话」独立入口 |
### 2.5 真人轨 `AskHumanRail`
顶栏切「真人1v1」(角标「新客半价」);同页亦嵌入 AI 轨中部的达人导流卡。
### 2.6 子页
- `/ask/soulmate` 灵魂伴侣
- `/ask/history` 会话历史
- Profile 创建嵌入式 Modal
---
## 3. 交互与业务规则
| 规则 ID | 规则 |
|---|---|
| R-ASK-01 | 每条用户消息消耗 1 次额度;深度思考 ×2 |
| R-ASK-02 | 额度=0 → PaywallSheet(会员优先) |
| R-ASK-03 | 切换对象后下一条消息带新 `profile_ctx_id` |
| R-ASK-04 | 对象无档案 → 强制建档流,不可发送 |
| R-ASK-05 | 流式中再次发送:排队或禁用(D:禁用) |
| R-ASK-06 | 敏感意图 → 危机卡片,不计成功陪伴文案 |
| R-ASK-07 | 切「真人1v1」不清除 AI 历史 |
| R-ASK-08 | 下拉加载更早消息,page_size=20 |
---
## 4. 状态机
```mermaid
stateDiagram-v2
[*] --> Boot
Boot --> IdleFresh: 无历史
Boot --> IdleHistory: 有历史
IdleFresh --> Streaming: send/chip
IdleHistory --> Streaming
Streaming --> IdleHistory: done
Streaming --> StreamError: fail
StreamError --> Streaming: retry
IdleFresh --> NeedProfile: 选TA无档
NeedProfile --> IdleFresh: 建档完成
IdleHistory --> QuotaEmpty
QuotaEmpty --> Paywall
IdleHistory --> HumanRail: tab
HumanRail --> IdleHistory: tab AI
```
全量状态:`Boot` · `IdleFresh` · `IdleHistory` · `Streaming` · `StreamError` · `NeedProfile` · `QuotaEmpty` · `Paywall` · `HumanRail` · `Offline` · `AuthRequired` · `DeepOn`(正交 flag)。
---
## 5. API
| API | 说明 |
|---|---|
| `GET /v1/ai/bootstrap` | 额度、默认 profile、引导问题、deep 是否可用 |
| `GET /v1/ai/conversations` | 列表 |
| `GET /v1/ai/conversations/{id}/messages?cursor=` | 历史 |
| `POST /v1/ai/chat` | body: `{conversation_id?, content, profile_ctx_id, dimension, deep}`**SSE** |
| `POST /v1/ai/conversations` | 新建 |
| `GET /v1/ai/quota` | remaining |
SSE 事件:`meta` · `delta` · `suggest` · `usage` · `error` · `done`
---
## 6. 异常矩阵
| 场景 | UI |
|---|---|
| SSE 中断 | 气泡「已中断」+ 重试 |
| 402 额度 | Paywall |
| 400 无档案 | NeedProfile |
| 403 内容安全 | 固定拒答 |
| 超时 30s | StreamError |
| 离线 | 禁用发送 |
---
## 7. 埋点
`ask_open` · `ask_send` · `ask_chip_click` · `ask_deep_toggle` · `ask_profile_switch` · `ask_dimension_change` · `ask_soulmate_open` · `ask_human_tab` · `ask_paywall_show` · `ask_stream_error`
---
## 8. 校验 ID
`V-A01` 顶栏双 Tab · `V-A02` 上下文三控件+灵魂伴侣 · `V-A03` 引导问题原文 · `V-A04` 下拉历史 Tip · `V-A05` 深度思考是否耗额度 · `V-A06` 流式表现
@@ -0,0 +1,75 @@
# 13 · 在线完整设计(达人 Marketplace
> Route: `/online` · Design Complete
---
## 1. 目标
达人发现 → 下单 → 文字/语音/连麦服务 → 评价 → 复购。
---
## 2. UI 清单
### 2.1 列表页(✅ E8 部分 · 与「问·真人1v1」同构)
底栏「在线」带运营角标 **「限免」**;新客链路易**直达「向TA提问」收银页**(券弹层「我知道了」),列表本体与问-真人轨共用筛选:
| 区 | 元素 |
|---|---|
| 顶栏双轨残留 | 若从问切入可仍见「测测AI / 真人1v1」 |
| 筛选 | 综合排序 · 全部工具 · 筛选 · 新客半价 |
| ExpertCard | 头像、活跃、好评率、测友推荐、价格/次 |
| 限免漏斗 | 点进 → 向TA提问(文字/语音/合盘/星盘…)+ 测测币/卡券/VIP 折扣 |
### 2.2 详情页 `/online/experts/{id}`
简介 · 资质标 · 服务 SKU(文字/语音/连麦+单价+时长)· 评价列表 · 底部「立即咨询」· 收藏。
### 2.3 下单确认 Sheet
SKU · 优惠券 · 协议勾选 · 应付金额 · 去支付。
### 2.4 会话页 `/consult/{orderId}`
| 模式 | UI |
|---|---|
| 文字 | 聊天 + 剩余时长/条数 |
| 语音 | 语音条 |
| 连麦 | 通话 UI + 权限 |
结束:评价 1–5 星 + 标签 + 文字。
---
## 3. 订单状态机(前端必须渲染)
`Created``Paying``Paid``WaitingAccept``InService``Completed``Reviewed`
旁路:`Cancelled` · `Rejected` · `Refunding` · `Refunded` · `Expired`
超时:Paid 后 N 分钟未接单自动退款(N 后台配,默认 15)。
---
## 4. API
`GET /v1/experts` · `GET /v1/experts/{id}` · `POST /v1/consult/orders` · `POST /v1/consult/orders/{id}/pay` · `GET /v1/consult/orders/{id}` · `POST /v1/consult/orders/{id}/cancel` · `POST /v1/consult/orders/{id}/review` · 消息走 IM 通道(WS)。
---
## 5. 权限与安全
麦克风/相机权限拒绝 → 引导设置,降级文字。
举报入口:会话内 · 详情页。
未成年人:禁止连麦(D)。
---
## 6. 埋点
`online_expose` · `expert_click` · `consult_sku_select` · `consult_pay_success` · `consult_review_submit`
## 7. 校验 ID
`V-O01` 筛选维度 · `V-O02` SKU 种类 · `V-O03` 价格展示 · `V-O04` 评价表单
@@ -0,0 +1,90 @@
# 14 · 我的完整设计
> Route: `/mine` · Design Complete
---
## 1. UI 清单
### 1.1 头部 `MineHeader`
头像(可换)· 昵称 · 会员徽章(非会员显示「开通会员」)· 编辑资料箭头。
### 1.2 资产条 `MineAssets`
| 格 | 内容 | 点击 |
|---|---|---|
| 会员 | 到期日/未开通 | `/membership` |
| AI 次数 | remaining | `/ask` 或 Paywall |
| 优惠券 | 张数 | `/coupons` |
| 积分 | 余额(若无则隐藏整格 · 模拟器校验) | `/points` |
### 1.3 功能列表(分组定稿)
**档案与内容**
1. 生命档案 → `/profile`
2. 我的测试 → `/mine/tests`
3. 我的报告 → `/mine/reports`
4. AI 对话记录 → `/ask/history`
5. 我的收藏 → `/mine/favorites`
**订单与商业**
6. 会员中心 → `/membership`
7. 我的订单 → `/mine/orders`
8. 咨询订单 → `/mine/consult-orders`
9. 商城订单 → `/shop/orders`
**其它**
10. 邀请好友 → 分享
11. 消息通知设置 → `/settings/notifications`
12. 账号与安全 → `/settings/account`
13. 客服与帮助 → `/help`
14. 关于 → `/about`(协议/隐私/注销入口)
---
## 2. 子页要点
| 页 | 关键交互 |
|---|---|
| 生命档案列表 | Self 置顶;Other 按更新;新建;滑动删除 |
| 报告库 | 类型筛选:星盘/合盘/测评/AI;锁态角标 |
| 订单 | 状态 Tab;详情;申请退款 |
| 会员中心 | 套餐卡:9.9/25/58/178;权益表;自动续费管理 |
| 注销 | 二次确认 + 冷却期说明 |
---
## 3. 状态
`Guest`(显示登录大按钮)· `Loading` · `Ready` · `VipActive` · `VipExpired` · `Error`
---
## 4. API
`GET /v1/me` · `GET /v1/membership/me` · `GET /v1/ai/quota` · `GET /v1/orders` · `POST /v1/auth/logout` · `POST /v1/account/delete`
`GET /v1/me`
```json
{
"user": {"id":"","nickname":"","avatar_url":""},
"membership": {"active":false,"plan":null,"expires_at":null},
"quota": {"ai_remaining":0},
"counts": {"coupons":0,"favorites":0,"reports":0}
}
```
---
## 5. 埋点
`mine_expose` · `mine_item_click{key}` · `membership_open` · `invite_click`
## 6. 校验 ID
`V-U01` 列表项集合 · `V-U02` 会员价展示 · `V-U03` 资产条格子 · `V-U04` 注销路径
@@ -0,0 +1,126 @@
# 20 · 星座工具完整设计(星盘 / 合盘 / 运势)
> Design Complete · 愈心谷落地时命名走 STRATEGY / 词表
---
## 1. 信息架构
```
工具入口(首页/广场)
├── 星盘(本命)
│ ├── 档案选择 / 新建
│ ├── 概览(太阳/月亮/上升 + 象限)
│ ├── 行星列表
│ ├── 宫位列表
│ ├── 相位表
│ ├── 深度解读(付费锁)
│ └── 分享卡片
├── 合盘
│ ├── 双档案选择
│ ├── 关系类型(恋爱/友情/亲子…)
│ ├── 五图 + 推运(as_of)
│ ├── 维度评分
│ ├── 深度报告(付费)
│ ├── 邀请合盘(token
│ └── 附近的人(geo
└── 今日运势
├── 日运卡片
├── 周/月切换
└── 推送订阅
```
---
## 2. 星盘页 `NatalChartPage`
### 2.1 Route
`/tools/natal` · query: `profile_id?`
### 2.2 UI
| 区块 | 说明 |
|---|---|
| `ProfilePicker` | Self 默认;可切 Other |
| `ChartWheel` | 外圈宫位 + 行星 glyph;可缩放旋转(定稿:双指缩放) |
| `BigThree` | 日/月/升 三卡 |
| `Tabs` | 概览 / 行星 / 宫位 / 相位 / 解读 |
| `PaywallBanner` | 深度解读锁态 |
### 2.3 状态
`NeedProfile``Computing``Ready``Paywalled` / `Unlocked` · `Error`
### 2.4 API
- `GET /v1/profiles` · `POST /v1/profiles`
- `POST /v1/reports/natal` body: `{ "profile_id": "" }`
- 响应:`summary`(免费)+ `detail`(锁字段)+ `charts.natal`
### 2.5 校验
`V-N01` 轮盘交互 · `V-N02` 深度锁点 · `V-N03` 分享卡片字段
---
## 3. 合盘页 `SynastryPage`(对齐已实现能力)
### 3.1 Route
`/tools/synastry` · `/synastry/invite/:token`
### 3.2 UI 定稿
| 区块 | 说明 |
|---|---|
| 双人档案条 | A/B 头像昵称 + 换人 |
| 关系类型 Chip | 恋爱默认 |
| 五图 Tab | 比较盘/组合盘/组合中点/时空中点/组合星座 — 与 API `charts` 对齐 |
| 推运 | `as_of` 日期选择;Progressed 说明文案 |
| 维度雷达/条 | 吸引/沟通/信任/长期… |
| 深度报告 CTA | 会员或单次解锁 |
| 社交 | 「邀请合盘」「附近的人」 |
### 3.3 附近的人
- 需用户显式打开 `geo_visible`
- 列表:距离档位 + 合盘入口
- 隐私:不暴露精确坐标给对方客户端
### 3.4 API(已有契约优先)
- `POST /v1/reports/synastry` `{ profile_id_a, profile_id_b, as_of? }`
- `GET /v1/synastry/nearby`
- `POST /v1/synastry/invites` · `GET /v1/synastry/invites/:token` · `POST .../accept`
### 3.5 校验
`V-S01` 五图 Tab 文案与顺序 · `V-S02` 邀请链路 · `V-S03` 附近隐私开关默认
---
## 4. 今日运势 `DailyFortunePage`
### 4.1 UI
日期头 · 综合分 · 爱情/事业/财运/健康四格 · 短建议 ·「查看完整」(会员)
### 4.2 API
`GET /v1/fortune/daily?profile_id=&date=`
### 4.3 校验
`V-F01` 分数字段 · `V-F02` 完整内容锁点
---
## 5. 埋点统一
`tool_open{tool}` · `chart_tab{name}` · `synastry_generate` · `synastry_unlock` · `fortune_expose` · `invite_share` · `nearby_open`
## 6. 愈心谷落地备注
- UI 禁用「占卜/算命」;可用运势/合盘/匹配/解读
- 星历计算依赖与 AGPL 风险见 API README;设计层不绑定具体库
@@ -0,0 +1,119 @@
# 21 · 测评与沉浸式玩法完整设计
> Design Complete · MBTI / 广场 / 沙盘 / 心情小镇 / 塔罗
---
## 1. 测评中心 `TestsHub`
### 1.1 Route
`/tests` · `/tests/:slug`
### 1.2 UI
- 分类 Chip:人格 / 情感 / 压力 / 趣味
- 卡片:封面 · 标题 · 题量 · 预计时长 · 热度 · 免费/付费角标
- 搜索(可选,二期)
### 1.3 答题流 `TestPlayer`
| 步骤 | 说明 |
|---|---|
| Intro | 说明用途、隐私、预计时长、开始 |
| Question | 单选为主;进度条;可上一题 |
| Submit | Loading → 结果 |
| Result | 类型码/分数 + 摘要 + 分享 +「深度报告」锁 |
状态:`Intro` · `Answering` · `Submitting` · `ResultFree` · `ResultPaywalled` · `Error`
API
- `GET /v1/tests` · `GET /v1/tests/:slug`
- `POST /v1/tests/:slug/sessions``session_id`
- `POST /v1/tests/sessions/:id/answer`
- `POST /v1/tests/sessions/:id/submit`
- `GET /v1/tests/sessions/:id/report`
校验:`V-T01` 进度可回退 · `V-T02` 结果锁点 · `V-T03` 历史入库「我的测试」
---
## 2. 心理广场 `PsychPlaza`
Route: `/plaza`
| 区块 | 设计定稿 |
|---|---|
| Feed | 图文/话题卡;点赞评论 |
| Topic | 官方话题置顶 |
| Publish | 发帖(需登录);敏感词过滤 |
| Detail | 评论树一级 + 楼中楼 |
API`GET /v1/plaza/feed` · `POST /v1/plaza/posts` · `POST .../like`
注意:UGC 审核队列进运营后台(见 40)。
校验:`V-P01` Feed 排序 · `V-P02` 发帖门槛
---
## 3. 沙盘 `Sandbox`
Route: `/sandbox`
定稿流程:
1. 空场景 + 道具架(人物/物品/自然)
2. 拖拽摆放;缩放旋转
3. 完成 → 生成解读摘要(AI 或模板)
4. 保存作品到「我的」;可分享静态图
状态:`Editing` · `Generating` · `Saved` · `Paywalled`(深度解读)
API`POST /v1/sandbox/sessions` · `POST .../complete` · `GET .../report`
校验:`V-B01` 道具集 · `V-B02` 解读是否 AI
---
## 4. 心情小镇 `MoodTown`
Route: `/mood-town`
定稿:
- 地图节点:今日心情打卡 · 小任务 · 收集物
- 打卡:情绪滑杆 + 可选日记
- 连续打卡奖励(积分/优惠券,与会员解耦)
API`POST /v1/mood/checkin` · `GET /v1/mood/calendar` · `GET /v1/mood/town-state`
校验:`V-M01` 节点集合 · `V-M02` 奖励规则
---
## 5. 塔罗 `Tarot`
Route: `/tarot`
定稿(合规表述:牌阵洞察 / 自我反思,非「算命」):
| 模式 | 说明 |
|---|---|
| 单牌 | 日签 |
| 三牌 | 过去/现在/未来(表述可改为 课题/现状/行动) |
| 牌阵库 | 恋爱/决策等模板 |
流程:选牌阵 → 洗牌动画 → 抽牌 → 正逆位 → 牌义摘要 → 深度(付费)
API`POST /v1/tarot/draw` `{ spread, seed? }` · `GET /v1/tarot/history`
校验:`V-R01` 牌阵列表 · `V-R02` 深度锁 · `V-R03` 文案是否触发词表禁词(实现闸)
---
## 6. 统一商业与埋点
- 深度结果统一走 `PaywallSheet`(会员优先 / 单次次之)
- 埋点:`test_start` · `test_complete` · `plaza_post` · `sandbox_complete` · `mood_checkin` · `tarot_draw` · `immersive_unlock`
@@ -0,0 +1,179 @@
# 30 · 完整数据模型 · API · 错误 · 缓存
> Design Complete · 路径前缀统一 `/api/v1`(下文简称 `/v1`
---
## 1. 领域实体(逻辑模型)
```
User ──< Profile (self|other)
User ── Membership
User ── AiQuota
User ──< Order ── OrderItem
User ──< Coupon
User ── DevicePush
User ──< Conversation ──< Message
User ──< ConsultOrder ── Consultant
User ──< TestSession ── TestReport
User ──< NatalReport / SynastryReport
User ──< TarotDraw / SandboxWork / MoodCheckin
User ── GeoPref (geo_visible, lat, lng, updated_at)
SynastryInvite (token, host_user, guest?, status)
PlazaPost ──< Comment
```
### 1.1 关键字段定稿
| 实体 | 必填字段 |
|---|---|
| Profile | id, user_id, kind, name, gender?, birth_date, birth_time?, birth_place, lat, lng, tz |
| Membership | user_id, plan(enum), status, starts_at, expires_at, auto_renew |
| Order | id, user_id, channel, amount_fen, status, product_type, product_ref |
| Conversation | id, user_id, mode(ai\|human), status, consultant_id? |
| SynastryReport | id, profile_a, profile_b, as_of?, summary_json, detail_json, unlocked |
| AiQuota | user_id, remaining, reset_at, source |
计划枚举:`trial_9_9` · `month_25` · `season_58` · `year_178`(展示价,分单位存储另表)
---
## 2. API 目录(完整设计表)
### 2.1 账号
| Method | Path | 说明 |
|---|---|---|
| POST | `/v1/auth/sms/send` | 发码 |
| POST | `/v1/auth/sms/login` | 登录/注册 |
| POST | `/v1/auth/logout` | 登出 |
| GET | `/v1/me` | 我的聚合 |
| PATCH | `/v1/me` | 改昵称头像 |
| POST | `/v1/account/delete` | 注销申请 |
### 2.2 档案
| Method | Path | 说明 |
|---|---|---|
| GET/POST | `/v1/profiles` | 列表/创建 |
| PATCH/DELETE | `/v1/profiles/:id` | 更新/删 |
| PATCH | `/v1/me/geo` | `{visible,lat?,lng?}` |
### 2.3 内容与报告
| Method | Path | 说明 |
|---|---|---|
| POST | `/v1/reports/natal` | 本命 |
| POST | `/v1/reports/synastry` | 合盘 |
| GET | `/v1/fortune/daily` | 日运 |
| GET | `/v1/reports` | 我的报告库 |
| GET | `/v1/reports/:id` | 单份(含锁态) |
### 2.4 合盘社交
| Method | Path | 说明 |
|---|---|---|
| POST | `/v1/synastry/invites` | 创建邀请 |
| GET | `/v1/synastry/invites/:token` | 预览(无 host_profile_id 泄露) |
| POST | `/v1/synastry/invites/:token/accept` | 接受 |
| GET | `/v1/synastry/nearby` | 附近 |
### 2.5 AI / 咨询
| Method | Path | 说明 |
|---|---|---|
| GET | `/v1/ai/quota` | 余量 |
| POST | `/v1/ask/conversations` | 开聊 |
| GET | `/v1/ask/conversations` | 历史 |
| POST | `/v1/ask/conversations/:id/messages` | 发消息(流式可选 SSE |
| GET | `/v1/consultants` | 达人列表 |
| POST | `/v1/consult/orders` | 下咨询单 |
| POST | `/v1/consult/orders/:id/cancel` | 取消 |
### 2.6 测评与沉浸
| Method | Path | 说明 |
|---|---|---|
| GET | `/v1/tests` | 列表 |
| * | `/v1/tests/...` | 见 21 |
| * | `/v1/plaza/...` | 见 21 |
| * | `/v1/sandbox/...` | 见 21 |
| * | `/v1/mood/...` | 见 21 |
| * | `/v1/tarot/...` | 见 21 |
### 2.7 商业
| Method | Path | 说明 |
|---|---|---|
| GET | `/v1/membership/plans` | 套餐 |
| POST | `/v1/pay/orders` | 创建支付单 |
| POST | `/v1/pay/mock/confirm` | 仅开发 mock |
| GET | `/v1/orders` | 订单列表 |
| GET | `/v1/coupons` | 优惠券 |
| POST | `/v1/pay/orders/:id/refund` | 申请退款 |
### 2.8 消息与配置
| Method | Path | 说明 |
|---|---|---|
| GET | `/v1/inbox` | 站内信聚合 |
| POST | `/v1/inbox/:id/read` | 已读 |
| GET | `/v1/home/feed` | 首页聚合 |
| GET | `/v1/config/app` | 开关/词表版本/审核模式 |
---
## 3. 统一响应与错误
### 3.1 成功包络
```json
{
"code": 0,
"message": "ok",
"data": {},
"request_id": "..."
}
```
### 3.2 错误码定稿
| code | HTTP | 含义 | 客户端 |
|---|---|---|---|
| 0 | 200 | 成功 | — |
| 40101 | 401 | 未登录 | 跳登录 |
| 40301 | 403 | 无权限/未解锁 | Paywall |
| 40302 | 403 | 会员权益不足 | Membership |
| 40401 | 404 | 资源不存在 | Toast |
| 40901 | 409 | 冲突(重复提交) | 忽略/提示 |
| 42201 | 422 | 参数错误 | 字段红字 |
| 42901 | 429 | 限流 | 稍后重试 |
| 40201 | 402/403 | 配额用尽 | 次数 Paywall |
| 50000 | 500 | 内部错误 | 通用错误页 |
锁态内容:**不**靠藏路由;返回 `unlocked:false` + `teaser`,完整 `detail` 仅解锁后下发(或同接口按 entitlement 裁剪)。
---
## 4. 缓存与一致性
| 数据 | 策略 |
|---|---|
| 首页 feed | CDN/边缘 60s;登录个性化部分 API 直出 |
| 日运 | 按 `profile_id+date` 缓存 1h |
| 本命/合盘计算结果 | 按档案哈希 + as_of 缓存;档案变更失效 |
| 我的聚合 `/me` | 客户端短缓存 30s;支付成功强制失效 |
| Inbox 未读 | 推送 + 轮询 60s(前台) |
| 词表/开关 | `/config/app` ETag;启动拉取 |
离线:仅缓存已解锁报告摘要;敏感档案不同步到未加密存储。
---
## 5. 分页约定
`?cursor=&limit=20` · 响应 `{ items, next_cursor }`
## 6. 与模拟器校验的关系
抓包对照本章路径与字段;差异记入 `99-emulator-validation.md` 的 Diff 表,再回写 OpenAPI。
@@ -0,0 +1,109 @@
# 40 · 运营 · 商业 · 推送 · 埋点 · 安全
> Design Complete
---
## 1. 运营后台模块(信息架构)
```
Admin
├── 内容:首页运营位 / 工具配置 / 测评上下架 / 话题
├── UGC:广场审核队列 / 举报处理
├── 达人:入驻审核 / 排班 / 分成配置
├── 商业:套餐 / 优惠券 / 订单 / 退款
├── 用户:检索 / 封禁 / 注销工单
├── 消息:站内信模板 / 推送任务
└── 系统:开关 / 词表版本 / 审计日志
```
权限:超级管理员 · 运营 · 审核 · 客服(只读订单+工单)
---
## 2. 支付与会员
### 2.1 商品类型
| product_type | 说明 | 履约 |
|---|---|---|
| `membership` | 会员套餐 | 写 Membership + 可能赠 AI 次 |
| `ai_pack` | AI 次包 | AiQuota += n |
| `report_unlock` | 单次报告 | report.unlocked=true |
| `consult` | 咨询时长/次 | ConsultOrder paid |
| `shop` | 实物/虚拟商品 | 履约状态机 |
### 2.2 支付状态机
`created``paying``paid` → (`refunding``refunded`) · `closed`
客户端:统一 `PaySheet`(渠道:微信/支付宝/IAP 占位;开发 `pay-mock`)。
### 2.3 价格展示(✅ E8 `free2/mine/会员.png`
| 档 | 展示价 | 划线/备注 |
|---|---|---|
| 连续包月(首月) | ¥9.9 | 后续 ¥25 自动续费 |
| 连续包月 | ¥25 | |
| 连续包季 | ¥58 | 划线例 ¥90 |
| 连续包年 | ¥178 | 划线例 ¥360 |
| 12个月套餐 | ¥368 | 年卡x水晶等运营 SKU |
自动续费:会员中心「记录」可关;文案含解除说明。
---
## 3. 推送
| 场景 | 通道 | 触发 |
|---|---|---|
| 日运提醒 | Push | 用户订阅 + 本地时区早晨 |
| 咨询回复 | Push + Inbox | 达人新消息 |
| 系统通知 | Inbox | 运营任务 |
| 支付成功 | Inbox | 履约完成 |
| 合盘邀请被接受 | Push | AcceptInvite |
开关:`/settings/notifications` 分项;系统级权限引导一次。
---
## 4. 埋点字典(核心)
| event | 必填属性 |
|---|---|
| `app_open` | cold/warm, app_ver |
| `tab_view` | tab |
| `tool_open` | tool |
| `paywall_expose` | scene, product_hint |
| `pay_click` | product_type, amount_fen |
| `pay_success` | order_id, product_type |
| `ask_send` | mode, conversation_id |
| `synastry_generate` | relation_type |
| `test_complete` | slug |
| `membership_open` | from |
实现:客户端 SDK 批量上报;`request_id` 可关联 API 日志。
---
## 5. 安全与合规
| 项 | 定稿 |
|---|---|
| 词表 | 硬禁「占卜」「算命」等;启动拉 `/config/app` |
| 未成年 | 支付与深度内容年龄门(策略开关) |
| 隐私 | 协议版本强更;geo 默认关;注销冷却 |
| 鉴权 | Bearer;刷新策略另开;后台操作审计 |
| 限流 | 登录/发帖/AI 分桶 |
| 支付 | 验签;幂等 `out_trade_no`mock 仅非生产 |
---
## 6. 客服与工单
入口:我的 → 帮助;订单详情 → 申请退款。
工单状态:`open` · `processing` · `resolved` · `rejected`
## 7. 校验 ID
`V-O01` 套餐价 · `V-O02` 支付渠道集合 · `V-O03` 推送分项 · `V-O04` 审核后台字段(无 App 内证,后台自建)
@@ -0,0 +1,131 @@
# 99 · 安卓模拟器采集验证协议
> 设计已定稿;本文件规定**如何用模拟器把 🟡/待证项变成 ✅ 或 Diff 回写**。
---
## 1. 目标
1. 对照 `complete-design` 各页的 **校验 IDV-\*** 采集证据。
2. 差异写入 Diff 表 → 回写对应设计文档 / OpenAPI。
3. 不阻塞当前 Feature Complete:未验证项保持「设计定稿 (D) + 待模拟器」。
---
## 2. 环境准备
| 项 | 建议 |
|---|---|
| 模拟器 | Android Emulator API 33+,安装官方测测 APK(或应用商店包) |
| 代理 | mitmproxy / Charles;模拟器 WiFi 代理指向宿主机 |
| HTTPS | 安装 user CA;若 SSL Pinning 失败则改用 UI 录屏 + 布局层次(uiautomator |
| 账号 | 新号 + 会员号各一;记录手机号不入库文档 |
| 录制 | 每条 V-\* 至少:截图 1 +(可选)HAR 片段 + 操作步骤 |
### 2.1 本机已装(2026-08
| 项 | 路径 / 名称 |
|---|---|
| SDK | `ANDROID_HOME=/opt/homebrew/share/android-commandlinetools` |
| AVD | `YuXinGu_API34`Pixel 7 / API 34 / google_apis / arm64 |
| Agent Skill | `/Users/jack/tools/android-adb-skill``./tools/android` + `~/.claude/skills/android-*` |
| Cursor Rule | `.cursor/rules/android-adb.mdc` |
| 冒烟截图 | `.tmp/cece-validation/smoke/screen.png` |
启动与截图:
```bash
emulator -avd YuXinGu_API34 -no-audio -gpu auto &
adb wait-for-device
./tools/android screenshot --out .tmp/cece-validation/smoke/screen.png --json
```
> 测测 APK 仍需另行安装后,才能跑 Batch A–D。
证据目录建议(本地,勿强求进 git):
```
.tmp/cece-validation/
YYYYMMDD/
V-H01/
steps.md
screen.png
traffic.har # 可选
```
---
## 3. 采集步骤(单条 V-\*
1. 打开设计文档中的校验 ID 定义(预期 UI/文案/API)。
2. 冷启动 App → 按步骤复现到目标屏。
3. 截图;若可抓包,过滤 host,保存相关 request/response。
4. 填写结果:`PASS` / `DIFF` / `BLOCKED`(如 pinning、地区限制)。
5. `DIFF` 必须写:期望(设计)vs 实际 + 建议改设计或改实现。
---
## 4. 优先级批次
### Batch A — 五 Tab 骨架(先做)
| ID | 主题 | 文档 |
|---|---|---|
| V-H01~ | 首页楼层顺序与运营位 | `10-page-home` |
| V-G01~ | 消息分类与未读 | `11-page-message` |
| V-A01 | 问一问 AI/人工切换 | `12-page-ask` |
| V-L01 | 连麦/在线列表 | `13-page-online` |
| V-U01~ | 我的列表与资产条 | `14-page-mine` |
### Batch B — 星座与合盘
| ID | 主题 | 文档 |
|---|---|---|
| V-N01~ | 本命轮盘与锁点 | `20-module-astrology` |
| V-S01~ | 五图顺序、邀请、附近默认 | 同上 |
| V-F01 | 日运字段 | 同上 |
### Batch C — 测评与沉浸
| ID | 主题 | 文档 |
|---|---|---|
| V-T01~ | 测评进度与结果锁 | `21-module-tests-immersive` |
| V-P01 | 广场 | 同上 |
| V-B01 / V-M01 / V-R01 | 沙盘/小镇/塔罗 | 同上 |
### Batch D — 商业与系统
| ID | 主题 | 文档 |
|---|---|---|
| V-O01 | 会员价与支付 | `40-ops-commerce` |
| 路径对照 | API 与 30 章一致性 | `30-data-api` |
---
## 5. Diff 登记表(模板)
复制到当次验证笔记:
| ID | 结果 | 期望(设计) | 实际(模拟器) | 处置 | 回写文件 |
|---|---|---|---|---|---|
| V-S01 | DIFF | 五图顺序 A-B-C… | 顺序为… | 改设计 / 改实现 | `20-module-astrology.md` |
处置约定:
- **改设计**:以竞品真机为准,更新 complete-design,证据链加 E\*。
- **改实现**:愈心谷已按设计开发则排期对齐。
- **忽略**:明确合规/品牌差异(词表),在文档标「刻意差异」。
---
## 6. 与 Evidence First 的衔接
- 模拟器截图/HAR → 记入 `cece-frontend-re/README.md` 证据表新行(E8+)。
- 原 🟡 项验证通过后改为 ✅,去掉「仅设计定稿」标注。
- 完整设计包门禁:**不**因未跑模拟器而撤销 Design Complete。
---
## 7. 愈心谷侧注意
验证测测时允许看到其原生产物用词;**落地愈心谷 UI 时仍走词表**,Diff 中单独列「合规替换」列,避免把禁词写进产品文案。
@@ -0,0 +1,64 @@
# 测测前端 · 完整产品设计包(Design Complete V1.0
> Status: **Design Complete(设计定稿)** · 实现与模拟器校验前的唯一前端设计输入
> 上游逆向底稿:[../README.md](../README.md)
> 方法:[reverse-engineering-spec.md](../../../../design/reverse-engineering-spec.md)
> 校验计划:安卓模拟器采集验证(见 [99-emulator-validation.md](99-emulator-validation.md)
---
## 0. 本包定位
| 项 | 说明 |
|---|---|
| 是什么 | 基于公开实测 + 逆向推导的 **Feature Complete 设计说明书** |
| 不是什么 | 不是 Demo;不是「以后再补」的大纲 |
| 证据策略 | ✅ 已证实写死;🟡/🔵 在本包中升格为 **设计定稿(D**,并列入模拟器校验清单 |
| 品牌 | 本文用「测测」指称竞品对象;愈心谷落地时过 lexicon,禁止自称测测 |
**冻结规则**:未经验证通过前,工程实现以本包为准;模拟器发现差分时,先改本包再改代码。
---
## 1. 文档地图
| 文档 | 内容 |
|---|---|
| [00-design-bible.md](00-design-bible.md) | 产品目标 · IA · 全局组件 · 全局状态 · 设计令牌约定 |
| [10-page-home.md](10-page-home.md) | 首页完整设计 |
| [11-page-message.md](11-page-message.md) | 消息完整设计 |
| [12-page-ask.md](12-page-ask.md) | 「问」完整设计 |
| [13-page-online.md](13-page-online.md) | 在线完整设计 |
| [14-page-mine.md](14-page-mine.md) | 我的完整设计 |
| [20-module-astrology.md](20-module-astrology.md) | 星座/星盘/合盘/运势完整设计 |
| [21-module-tests-immersive.md](21-module-tests-immersive.md) | 测评/广场/沙盘/心情小镇/塔罗 |
| [30-data-api.md](30-data-api.md) | 数据模型 · 表 · API · 错误码 · 缓存 |
| [40-ops-commerce.md](40-ops-commerce.md) | 后台 · 权限 · 支付 · 消息 · 埋点 · 配置 · 安全 |
| [99-emulator-validation.md](99-emulator-validation.md) | 安卓模拟器采集与差分回填协议 |
| [evidence-20260803.md](evidence-20260803.md) | **E8 真机 Diff**10.50.0 模拟器) |
| [STATUS-overnight.md](STATUS-overnight.md) | 夜间采集结果摘要(起床看) |
---
## 2. 设计完成度门禁
| 门禁 | 标准 |
|---|---|
| Design Complete | 本包各文档无「略/TODO」;每页含 UI 清单、交互、状态机、接口、异常、埋点 |
| Validation Ready | `99-emulator-validation.md` 用例可执行 |
| Impl Ready | `30-data-api` + 页面契约可直接开工 |
| Parity Verified | 模拟器采集后差分关闭(后续) |
当前:**Design Complete + Validation Ready**。Parity Verified = 待模拟器。
---
## 3. 与逆向底稿关系
```text
../0008 逆向分析(Evidence First
↓ 升格定稿
complete-design/* 完整设计(本包)
↓ 模拟器采集
差分回填 → 修订本包 → 再实现/再验
```
@@ -0,0 +1,41 @@
# 夜间采集状态(给你起床看)
> 时间:2026-08-03 凌晨 · APK 10.50.0 · 已登录账号
## 结论
**免付费主路径大部分已截到**,设计 Diff 已写入 `evidence-20260803.md` + 首页/消息/问文档。
工具宫格与「更多」清单已采;「我的」子页与部分在线列表曾被 SVIP/向TA提问 收银页干扰,需醒来后补一轮。
## 截图目录(本地)
| 目录 | 内容 |
|---|---|
| `.tmp/cece-validation/20260803/free2/` | **主成果**(包名校验后) |
| `free2/01-home.png``0x-tab-*.png` | 五 Tab / 问双轨 |
| `free2/tools/*.png` | 宫格落地:星座/星盘/合盘/紫微/陪伴小星/倾诉/智慧卡/报告/生辰历/灵魂伴侣/广场/更多… |
| `free2/tools/more/*.png` | 更多页子项 |
| `free2/manifest.json` | 清单(脚本结束后生成) |
## 已回写设计
- `00-design-bible.md` 底栏角标
- `10-page-home.md` 宫格顺序 / 自己卡片五维
- `11-page-message.md` 列表形态
- `12-page-ask.md` AI 引导题与底栏快捷
- `evidence-20260803.md` E8
## 「更多」实机条目(✅ labels)
推荐 · 星盘报告 · 测试 · 倾诉 · 心情小镇 · 幸运地图 · 星宿 · 爱情树 · 灵魂伴侣 · 聊天分析 · 关系网 · 商城 · 解读 · 沙盘 · 缘分合盘 · 星座 · 生辰 · 紫微 · 政余 · 灵数 · 生肖 · 玛雅图腾 · 人类图 · 星盘 · 生辰历 · 紫微历 · 政余历 · 星骰 · 智慧卡 · 日历
## 醒来建议(可选 10 分钟)
1. 确认模拟器还在:`adb devices`
2. 打开测测,关掉任何 SVIP/向TA提问弹层
3. 说「继续补我的和在线列表」——我只补这两块
## 脚本
- `tools/cece_capture_free.py`(初版)
- 夜间实际用的是内联 package-guard 流程;稳定版可再收束进脚本
@@ -0,0 +1,92 @@
# 真机证据 Diff · 2026-08-03(模拟器 · 测测 10.50.0
> Evidence ID: **E8** · AVD `YuXinGu_API34` · package `com.xxwolo.cc5` · APK `bird-xxdoc-android-release-xxwolo-10.50.0`
> 截图根目录:`.tmp/cece-validation/20260803/`(本地,未入库)
> 主成果:`free2/`34 张)· 说明:[STATUS-overnight.md](STATUS-overnight.md)
---
## 1. 冷启动 / 门禁
| 屏 | 证据 | 定稿结论 |
|---|---|---|
| 温馨提示 | `onboarding/10-start.png` | 同意 / 不同意→游客;披露位置·麦克风·设备信息 |
| 游客首页 | `V-H01/home.png` | 底栏右端为「未登录」;中间「问」+ AI 角标 |
| 登录页 | 点「同意」后 | 手机号+验证码 / 密码登录 / 其他方式;协议勾选 |
| 未成年人模式 | `logged/00-current.png` | 开启未成年人模式 / **不再提醒** |
| 每日登录领好礼 | 遮罩态截图 | 回归福利七日;立即领取;下方 X 关闭 |
| 隐私政策更新 | 登录后偶发 | 同意 / 不同意并退出 |
---
## 2. 底栏五 Tab(已登录 · ✅)
| 序 | 文案 | 角标/形态 | Diff vs 原设计 |
|---|---|---|---|
| 1 | 首页 | 选中态房子图标 | 一致 |
| 2 | 消息 | 红点数字 | 一致 |
| 3 | **问** | **中央大圆 + AI 角标** | 一致;无障碍树常无「问」文本 |
| 4 | 在线 | 红标「限免」 | **新增运营角标**;易直达向TA提问 |
| 5 | 我的 | 红点 | 游客态文案为「未登录」 |
---
## 3. 首页结构(已登录 · ✅ V-H01)
### 3.1 顶区
签到 · 搜索运营占位轮播 · `+` · 「输入生日,更加了解TA」
### 3.2 自己卡片
今日心情分 + 五维:**爱情 / 财富 / 事业 / 学习 / 人际**
### 3.3 宫格
**第一行:** I人E人 · 星座 · 星盘 · 生辰 · 缘分合盘 · 紫微
**第二行:** 陪伴小星 · 倾诉 · 智慧卡 · 星盘报告(New) · 生辰历 · 灵魂伴侣
宫格下:AI玩法广场大卡 + 商城运营卡;脚注「部分标题由AI生成,仅供参考」。
### 3.4 更多页条目(✅)
`10-page-home.md` §2.3.1;含沙盘/心情小镇/幸运地图/爱情树/人类图等。
---
## 4. 截图清单(`free2/`
| 路径 | 说明 |
|---|---|
| `01-home` · `02-tab-home` | 首页 |
| `03-tab-message` | 消息 |
| `04-tab-ask*` | 问 · AI / 真人1v1 |
| `05-tab-online` | 在线(注意限免漏斗) |
| `06-tab-mine*` | 我的 |
| `tools/*` | 宫格落地免付费页 |
| `tools/more/*` | 更多子项 |
| `mine/{root,会员,档案,测试,报告}` | 我的子页;会员价 ✅ |
| `manifest.json` | 34 张索引 |
---
## 5. 「问」轨 Diff(✅)
- 顶栏:`测测AI` | `真人1v1`(「新客半价」)
- 引导题:财富建议 / 工作发展 / 性格弱点 / 复合(及变体)
- 底栏:工具 · 语音通话 · 深度解读 · 灵魂伴侣
- 免责声明固定底
---
## 6. 会员价(✅)
连续包月首月 ¥9.9 → ¥25;季 ¥58;年 ¥178(见 `40-ops-commerce.md`)。
---
## 7. 愈心谷落地注意
- 竞品文案含「测测」;落地过 lexicon。
- 游客 / 未成年人 / 每日领取 / 隐私更新 为必做门禁。
- 「向TA提问」为高意图收银,列表浏览需可退回。
+152
View File
@@ -0,0 +1,152 @@
# Feature Spec: 陪伴(节气壳)
> Status: `Active` · Map: `§4 陪伴 [P2]` · Phase: `P2 Complete`
> 规范:[../feature-design.md](../feature-design.md)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 陪伴 |
| Purpose | 日常留存:节气生活建议与心情记录 |
| Business Goal | Tab 占位完整;P2 做深留存 |
| InP1 壳) | OutP1 |
|---|---|
| 今日节气展示(本地/轻 API) | 完整心情 OS |
| 生活建议(非运势) | 疗效承诺 |
| 路由与 Tab 可达 | 强制日记社交 |
| InP2 | |
|---|---|
| 心情记录落库、成长记录 | |
---
## 2. 用户价值
1. **为何需要:** 需要轻量每日触达,不只是一次性测试。
2. **P1 获得:** 今日节气与建议壳。
3. **付费:** N/AP1)。
---
## 3. 用户角色
| Actor | P1 |
|---|---|
| Visitor | 可打开陪伴页看节气壳 |
---
## 4. 用户流程
```text
Tab 陪伴 → /companion
展示今日节气 + 生活建议文案
P2)记录心情 → POST /moods
```
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/companion` | CompanionPage |
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Loading | 拉节气 |
| Normal | 节气 + 建议 |
| Error | 降级本地文案或重试 |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 文案为「生活建议 / 节气」,禁止「今日运势」 |
| R2 | P1 不宣称完整陪伴 OS 已交付 |
| R3 | 心情 API 若暴露须鉴权;P1 可不接 UI |
| R4 | 扩行为前必须把本 Spec Phase 与 In Scope 升为 P2 并补验收 |
---
## 8. 数据模型影响
| 表 | P1 | P2 |
|---|---|---|
| solar term | 只读 API/本地 | |
| `moods` | 可有 API | UI 写入 |
---
## 9. API 需求
| Method | Path | 意图 |
|---|---|---|
| GET | `/api/v1/solar-terms/today` | 今日节气 |
| POST | `/api/v1/moods` | P2 心情 |
---
## 10. 权限设计
| 能力 | Visitor |
|---|---|
| 看节气壳 | ✓ |
| 写心情 | P2 |
---
## 11. 埋点
| Event | 触发 | 可选 params |
|---|---|---|
| `companion_viewed` | 打开 `/companion` | — |
| `mood_saved` | 心情保存成功 | `score`(整数分,非正文) |
| `growth_plan_viewed` | 打开 `/growth-plan` 且列表加载结束 | — |
| `growth_plan_created` | 创建计划成功 | — |
| `growth_plan_checkin` | 今日打卡成功 | — |
禁止参数含计划 title/focus/note 明文。
---
## 12. 测试验收标准
**Given** P1
**When** 打开陪伴
**Then** 页面可达且无运势禁用词;不因未做心情而崩溃
**Given** 要将心情做进 P1
**When** —
**Then** **禁止**在未改 Spec/map 分期前实现
---
## 13. AI 开发前检查
- [x] 壳范围已标明 · 禁止超 scope
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| Packages | `CompanionPage` · `internal/companion` · moods 表 |
| 实现 | GET `/solar-terms/today` · POST `/moods` · GET `/moods/today` · H5 心情 UI |
| Gaps | 推送(后置 / Ops-E |
| Label | Feature CompleteP2:节气 + 心情 + 近七日轨迹;成长计划见 `/growth-plan` |
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · 心情已按产品「其他先做」落地 |
@@ -0,0 +1,22 @@
# Feature Spec: 小程序咨询域(原生 Go)
> Status: `Active` · ECR-050
## 1. 功能定义
小程序首页/咨询/测评/订单/我的资料不再打 Java。Go 用 PostgreSQL 提供与原 `/psychic/*` 相同的字段合同。
## 2. Business Rules
| ID | Rule |
|---|---|
| C1 | 未登录可看 banner、资讯、测评列表、咨询师、档期、协议 |
| C2 | 登录后才能交卷、关注、下单、改资料、反馈 |
| C3 | 下单锁时段;取消未支付订单释放时段 |
| C4 | 金额单位:分;支付 openid = `users.wx_openid` |
| C5 | 测评仅单选计分,按分数区间匹配结果 |
| C6 | 协议路径保持历史拼写 `procotol` |
## 3. API
全部挂在 `/api/v1/psychic/*`,字段与原 Java App VO 一致(见 ECR-050 BD)。
+223
View File
@@ -0,0 +1,223 @@
# Feature Spec: 探索测试
> Status: `Active` · Map: `2.2 人格测评 [P1]` · Phase: `P1`
> 规范:[../feature-design.md](../feature-design.md)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 探索测试 |
| Purpose | 通过短量表帮助用户了解沟通方式、情感模式等偏好 |
| Business Goal | 丰富探索中心;结果导流关系理解与问答;可分享 |
| In | Out |
|---|---|
| 已发布量表列表、答题、计分、丰富结果 | 伪 MBTI 版权侵权内容 |
| ≥1 热门测试(P1:沟通方式 + 情感模式) | 医疗量表诊断 |
| 分享结果卡 | 未定义的「深度付费层」若未实现则标 Gap |
---
## 2. 用户价值
1. **为何需要:** 比生日画像更场景化的自我标签。
2. **完成后获得:** 风格标签、概述、维度、建议、话术、成长计划。
3. **付费:** P1 结果全量返回(免费);深度会员导流为软转化(非强制锁结果)。`Gap:` 若产品后续要对部分结果上锁,须先更新本 Spec。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| Visitor | 浏览列表;提交需 Self Profile |
| 无档案 | 可看题,提交前引导建档 |
---
## 4. 用户流程
```text
/explore 测试列表
进入 /scales/:slug
已有结果? → 直接展示最近结果 +「重新测试」
↓(无结果 / 点重测)
加载题目 · 逐题作答(须全部完成)
无 Self → 引导建档
POST result → 展示丰富结果
分享 / 去关系理解 / 去问答
```
### 子能力展开
| 子能力 | P1 |
|---|---|
| 测试入口(探索 Tab · 首页宫格) | ✓ · 产品向 `mbti-lite`;探索主路径为 curated 题库(A 集) |
| 测试列表 | ✓ · 探索「题库精选」宫格(每类 1~2)+「题库分类」;分类页 `/explore/bank/:key` |
| 题库范围(A) | ✓ 人格 / 情绪能力 / 智能 / 生活与关系;**不含**抑郁焦虑强迫躁狂双相等临床筛查 |
| 问题流程 | ✓ |
| 答题保存(服务端结果落库) | ✓ |
| 最近结果回看 | ✓ GET `/scales/{slug}/result`;有结果进页不重复作答 |
| 重新测试 | ✓ 结果页按钮 → 清空草稿再答;新结果落库并覆盖展示 |
| 中断恢复 | ✓ localStorage 草稿(`scaleDraft`);提交后清除 |
| 结果生成(丰富结构) | ✓ |
| 免费层 | ✓ 全量 result |
| 深度层 | N/A(当前不锁) |
| 分享 | ✓ ShareSheet |
| AI 解释 | 软链 `/ask` |
| 数据统计 | 埋点名定义;SDK `Gap` |
| 验收标准 | §12 |
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/explore` | ExplorePage(题库精选宫格 + 题库分类 + 其它工具) |
| `/explore/bank/:category` | ExploreBankCategoryPage · curated 题库分类列表 |
| `/explore/:category` | ExploreCategoryPage · 产品工具分类(解码/星座等) |
| `/scales/:slug` | ScalePage(含 bank slug |
```text
/scales/:slug
├── Loading(题目)
├── Normal(答题中)
├── Empty/NeedProfile(提交前无档案)
├── Error
└── Result(完成后)
```
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Loading | 加载题目 |
| Error | 重试 |
| Normal | 进度 + 单选题 |
| NeedProfile | 引导首页 |
| Result | ReportRich 结构展示 |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 仅 `published` 量表可列表/作答 |
| R2 | 提交前答案覆盖全部题目 |
| R3 | 必须绑定用户 Self `profile_id` |
| R4 | 计分:多数选项 → style;结果文案 lexicon 安全 |
| R5 | result 含 label/summary/overview/dimensions/tips/scripts/growth_plan/faq |
| R6 | 结果「不是固定标签」需在文案中提示 |
| R7 | 作答过程写入本地草稿(按 slug);提交成功后清除;刷新可恢复未提交答案 |
| R8 | 同一用户同一 slug(含 curated 题库 slug)若已有 `scale_results`,再次进入直接展示**最近一次**结果,并提供「重新测试」;未点重测不得自动进入答题 |
| R9 | `mbti-lite` 产品展示名统一为「MBTI测试」(首页宫格 / 探索入口 / 量表 title) |
| R10 | **标准版 `mbti-lite`**:开源 OEJTS 1.2 · **32 题**(四维各 8)· 双极 1–5 Likert;按维累加,阈值判出 E/I·S/N·T/F·J/P 一侧,合成四字母类型;**免费** |
| R11 | **完整版 `mbti-full`**:60 题(四维各 15)· 须**成长会员**;未开通时 GET 返回 `locked=true` 且无题目;提交返回 403 |
| R12 | 禁止使用官方 MBTI® 版权题干;结果须提示「不是固定标签」;题库重大更新须 soft-delete 旧 `scale_results` |
| R13 | curated 题库(`scalebank`)仅含 A 集非临床探索量表;文案须声明「非诊断」;临床类(抑郁/焦虑/强迫等)不得进入 C 端 |
| R14 | curated 题库作答走同一 `/scales/:slug`;完成后再次点击入口须遵守 R8(只看结果或显式重测),不得每次从头作答 |
---
## 8. 数据模型影响
| 表 | 备注 |
|---|---|
| `scales` / `scale_questions` | seed |
| `scale_results` | answers + result jsonb |
---
## 9. API 需求
| Method | Path | 意图 |
|---|---|---|
| GET | `/api/v1/scales` | 列表 |
| GET | `/api/v1/scales/{slug}` | 题目 |
| GET | `/api/v1/scales/{slug}/result` | 当前用户该量表最近一次结果;无则 404 |
| POST | `/api/v1/scales/{slug}/result` | 提交计分 |
---
## 10. 权限设计
| 能力 | Visitor 无档案 | Visitor 有 Self |
|---|---|---|
| 看列表/题目 | ✓ | ✓ |
| 提交结果 | ✗ | ✓ |
| `mbti-full` 作答 | ✗(须成长会员) | ✓(会员 active) |
---
## 11. 埋点
经统一 `track()`;非 P1 核心 5 事件。禁止参数含题干全文、答案明文、档案 ID。
| Event | 触发 | 可选 params |
|---|---|---|
| `scale_list_viewed` | 打开 `/explore` 且题库 catalog 加载成功 | — |
| `scale_bank_category_viewed` | 打开 `/explore/bank/:category` 且分类加载成功 | `category`key |
| `scale_started` | 用户点开始进入作答(含「重新测试」后再开始) | `slug` · `access`: free\|member |
| `scale_completed` | 提交计分成功并展示结果 | `slug` · `access`: free\|member |
| `scale_result_reopened` | 再次进入已有结果直接展示(R8,未重测) | `slug` |
| `scale_retake_clicked` | 点「重新测试」 | `slug` |
| `scale_locked_viewed` | 会员锁页展示(如 mbti-full | `slug` |
| `scale_share_clicked` | 结果页打开分享 | `slug` |
| `scale_cta_relation` / `scale_cta_ask` | 结果导流(若 UI 有) | `slug` |
`page_view``/explore` · `/explore/bank/*` · `/scales/*` 由路由自动采集。
---
## 12. 测试验收标准
**Given** published 量表与 Self
**When** 答完提交
**Then** 返回 label 与 overview/tips 等丰富字段
**Given** 已提交过结果
**When** 再次进入 `/scales/{slug}`
**Then** 直接展示最近结果与「重新测试」;不进入答题
**Given** 结果页点「重新测试」并完成提交
**When** 再次进入
**Then** 展示新结果
**Given** 未答完
**When** 提交
**Then** 前端拦截;不成功落库
**Given** 无 Self
**When** 提交
**Then** 引导建档
---
## 13. AI 开发前检查
- [x] Spec 齐全 · 子能力已展开 · map · lexicon · OpenAPI · 可测
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| Packages | `internal/scale` · `service/scale` · `ExplorePage` · `ScalePage` |
| Seeds | communication-style · emotion-pattern · **mbti-liteOEJTS 32** · **mbti-full60·会员)** |
| Gaps | 结果付费墙若要做须先改 Spec;全量 §11 埋点未挂(核心漏斗见 analytics) |
| Tests | score/result L1`ScoreJungian``scaleDraft.spec`Scale 流程组件测 |
| Process Review | OEJTS 标准/完整双轨 · 最近结果回看 · P1 收口 |
| Credit | OEJTS / Open Psychometrics · openjung MIT |
+177
View File
@@ -0,0 +1,177 @@
# Feature Spec: 首页(发现与入口)
> Status: `Active` · Map: `§1 首页 [P1]` · Phase: `P1`
> 规范:[../feature-design.md](../feature-design.md)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 首页 |
| Purpose | 品牌露出 + 建档/性格探索主 CTA + 功能入口分发 |
| Business Goal | 新用户进入 Step 1–3;品牌第一屏可识别 |
| In | Out |
|---|---|
| 建档生日表单 → 画像;九宫格/入口 | 运势 Feed 主路径 |
| 推荐区静态/轻运营即可 | Dashboard 式状态墙(如「API 已连接」勿对用户展示) |
---
## 2. 用户价值
1. **为何需要:** 知道从哪开始认识自己。
2. **完成后获得:** 一键进入画像主路径或其它 Tab。
3. **付费:** N/A。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| 新 Visitor | 见品牌 + 建档 CTA |
| 老用户 | 同样入口;可去「我的」看资产 |
---
## 4. 用户流程
```text
打开 /
看到品牌 + 主 CTA(生日/探索)
提交生日 → 创建档案 → /portrait
点入口 → /explore /relation /ask /membership …
```
设计约束(前端):品牌英雄级信号;移动优先;文案 lexicon。
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/` | HomePage |
| 全局 | AppHeader · TabBar |
```text
/
├── 全局顶栏:透明愈心谷 Logo(AppHeader,全站)
├── 「自己」卡片标题展示账号昵称(默认意象词+场景词;档案页可改)
├── 穿衣指数 · 颜色搭配 · 养生推荐
├── 功能入口(4 列固定网格 · 多行换行 · 禁止横向滑动)
└── (可选)推荐内容
```
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Normal | 主路径可见 |
| Error | 建档/跳转失败可感知 |
| Loading | 提交建档时按钮态 |
Empty:首页本身是入口,不因无档案空白死页。
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 主 CTA 必须通向建档或画像,而非死链 |
| R2 | 不展示内部运维信息(API 连接状态等) |
| R3 | 入口文案符合 lexicon(个人画像/关系理解/成长会员…) |
| R4 | Tab 五名冻结:首页·探索·问答·陪伴·我的 |
| R5 | 「自己」卡片:穿衣指数 / 颜色搭配 / 养生推荐;有 Self 生日时按生日+**本地日历**+**十二时辰**易经种子生成;**每一时辰准点切换**;无档案或 LLM 不可用则本地回退 |
| R6 | 文案禁止占卜/算命恐吓与医疗疗效承诺;卦象仅作节律意象 |
| R7 | 贴士按 `user × 时辰起点` 持久缓存;GET 优先读缓存**即时返回**;缓存未命中时先回退/旧值,后台异步生成写入,禁止每次打开同步等 LLM |
| R8 | 响应含 `shichen` / `shichen_name` / `valid_until`(下一时辰起点);前端在 `valid_until` 自动静默刷新 |
---
## 8. 数据模型影响
经首页建档时写 `profiles``home_daily_tips(user_id, shichen_start, tips jsonb)` 缓存时辰贴士。
---
## 9. API 需求
| Method | Path | 说明 |
|---|---|---|
| GET | `/api/v1/home/tools` | 宫格(已有) |
| GET | `/api/v1/home/daily-tips` | 自己卡片贴士(读缓存;含 valid_until |
| — | 复用 | `POST /profiles``POST /reports/portrait` |
---
## 10. 权限设计
| 能力 | Visitor | User |
|---|---|---|
| 浏览首页 | ✓ | ✓ |
| 建档并生成画像 | 需登录 | ✓ |
| daily-tips(个性化) | 回退文案 | 有 Self 生日则 LLM |
---
## 11. 埋点
| Event | 触发 |
|---|---|
| `home_viewed` | 打开 |
| `home_cta_portrait` | 主 CTA |
| `home_entry_click` | 九宫格项(带 name |
---
## 12. 测试验收标准
**Given** 新用户
**When** 打开首页
**Then** 可见品牌与建档/探索入口
**Given** 合法生日
**When** 提交主 CTA
**Then** 进入画像基础结果路径
**Given** 已登录且有 Self 生日、该时辰已有缓存
**When** GET `/home/daily-tips`
**Then** 立即返回缓存(含 clothing/palette/wellness / valid_until),不阻塞 LLM
**Given** 时辰切换到点
**When** 前端到达 `valid_until`
**Then** 静默刷新;穿衣/颜色/养生随新时辰更新
**Given** 无档案或无 LLM
**When** GET `/home/daily-tips`
**Then** `source=fallback` 且页面不白屏
---
## 13. AI 开发前检查
- [x] lexicon
- [x] 不恐吓 / 不算命话术
- [x] OpenAPI 已登记 `/home/daily-tips`
- [x] Spec 齐全
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| Packages | `HomePage` · `App.vue` shell |
| Gaps | 推荐 Feed 运营位可静态;埋点未接 |
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · 设计闭合 · 实现 PASS · 测试 PARTIAL |
+186
View File
@@ -0,0 +1,186 @@
# Feature Spec: 意象卡片
> Status: `Active` · Map: `2.8 意象卡片 [P2]` · Phase: `P2 Complete`
> 规范:[../feature-design.md](../feature-design.md) · 队列:[P2-BACKLOG.md](P2-BACKLOG.md)
> 竞品对照:塔罗体系(能力同构;**UI 禁止「塔罗」入口名**)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 意象卡片 |
| Purpose | 通过抽取 1~3 张意象卡,对当下议题做投射反思,并给出结构化反思题与行动建议 |
| Business Goal | 高趣味探索与分享;免费次数 + 深度解读转化 |
| In | Out |
|---|---|
| 场景选题 · 抽卡 · 探索摘要 · 深度组合解读 | 吉凶判定、神谕、恐吓 |
| 卡面内容库(seed) | UI 文案「塔罗」「牌阵占卜」 |
| 每日免费次数规则 | 宿命叙事 |
---
## 2. 用户价值
1. **为何需要:** 卡住时需要一个轻量的外在意象帮助整理感受。
2. **完成后获得:** 卡片意象说明、反思问题、可执行小建议;深度版含组合解读与练习。
3. **为何付费:** 多卡组合与完整练习路径。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| Visitor | 每日免费 N 次基础抽卡(N 实现时定数,建议 1~3) |
| DeepAccess(本结果)/ VIP | 深度组合解读 |
| 可选挂档案 | 有档案时文案可轻微个性化(非必须) |
---
## 4. 用户流程
```text
/cards
选择场景:情绪整理 / 关系 / 选择 / 自我
检查今日免费次数
├─ 耗尽 → 引导会员或明日再来(可看历史)
└─ 有余 → 抽 1 张(免费)或解锁 3 张组合(深度)
展示意象 + 反思题 + 建议
分享(积极、非恐吓视觉)
```
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/cards` | ImageCardPageP2 draft |
| `/explore` | 入口「意象卡片」 |
| `/reports/:id` 或结果页内 | 深度结果沉淀(可选) |
```text
/cards
├── Scene picker
├── Loading(抽卡动画,克制)
├── Normal(单卡摘要)
├── Locked(组合深度)
├── Quota empty
└── Error
```
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Loading | 抽卡中 |
| Normal | 意象说明 + 反思 |
| Locked | 组合解读墙 |
| Quota empty | 次数用尽说明 + 会员 CTA |
| Error | 重试 |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 用户可见文案**不得**出现「塔罗」;用「意象卡片」「探索」「反思」 |
| R2 | **禁止**吉凶、神谕式断言、恐吓(如「大难」) |
| R3 | 输出必须含:意象描述 · 至少 1 个反思问题 · 1 条可执行建议 |
| R4 | 免费:每日有限次单卡摘要;深度:3 卡组合 + 练习(Membership 或单次 DeepAccess |
| R5 | 抽卡随机可接受,但卡面文案来自审核过的内容库(非模型现场胡编吉凶) |
| R6 | 分享卡不得含恐吓图文;过 lexicon |
| R7 | 次数与权益 **Server** 判定 |
---
## 8. 数据模型影响
| 项 | 说明 |
|---|---|
| 内容库 | `image_cards` 表或 seed JSONid, title, image_key, explore_text, prompts[] |
| 结果 | `growth_reports.type=image_card` **或** `scale_results` 变体(实现时二选一,写 OpenAPI) |
| 配额 | 用户日维度计数(表或 Redis);实现时定 |
禁止:`tarot_*` 作用户可见 API 路径名(对内包名用 `imagecard`)。
---
## 9. API 需求(草案)
| Method | Path | 意图 |
|---|---|---|
| GET | `/api/v1/image-cards/scenes` | 场景列表 |
| POST | `/api/v1/image-cards/draw` | scene → 抽卡结果(扣免费次) |
| GET | `/api/v1/image-cards/quota` | 今日剩余 |
| GET | `/api/v1/reports/{id}` | 若沉淀为报告 |
深度组合可同 draw 参数 `depth=true` + 权益校验。
---
## 10. 权限设计
| 能力 | 免费额度内 | 额度外 | 深度权益 |
|---|---|---|---|
| 单卡摘要 | ✓ | ✗ | ✓ |
| 三卡组合解读 | ✗ | ✗ | ✓ |
---
## 11. 埋点
| Event | 触发 |
|---|---|
| `cards_scene_selected` | 选场景 |
| `cards_drawn` | 抽卡成功 |
| `cards_quota_exhausted` | 次数用尽 |
| `deep_access_clicked` | surface=cards |
| `cards_share_clicked` | 分享 |
---
## 12. 测试验收标准
**Given** 有免费次数
**When** 抽卡
**Then** 返回意象+反思题+建议;响应与 UI 无「塔罗」「吉凶」
**Given** 次数为 0
**When** 再抽
**Then** 业务错误,不生成假深度
**Given** 无深度权益
**When** 请求组合解读
**Then** Locked / 剥离
---
## 13. AI 开发前检查
- [x] Spec 齐全 · 禁用塔罗入口已写清
- [x] lexicon ImageCard
- [x] 内容库 seed 与 OpenAPI(编码时)
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| 复用 | ShareSheet · membership/orders · Explore 入口 |
| 工作量 | 卡面文案/视觉资产最大;宜先 22~78 张小库 MVP |
| Packages | `internal/imagecard` · `ImageCardPage` `/cards` |
| 实现 | scenes/quota/draw API · 报告 type=`image_card` · 日配额 · ≥78 牌(手写底稿+确定性扩容)· ≥8 场景 |
| Gaps | 全手写美术资产;推送 |
| Label | Feature CompleteP2 |
@@ -0,0 +1,123 @@
# Feature Spec: 用户文字输入合规校验
> Status: `Active` · Map: `横切 · 安全/合规` · Phase: `P2`
> 关联:[lexicon.md](../lexicon.md) · [.ai/security.md](../../security.md) · account-auth / profile / ask / companion
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 文字输入合规(Text Compliance |
| Purpose | 所有用户提交的**自由文字**在服务端统一做合法性/合规校验;前端可做即时提示,**以后端拒绝为准** |
| Business Goal | 降低 XSS/注入、恐吓与医疗疗效话术、垃圾刷屏进入 DB 与模型上下文的风险 |
| In | Out |
|---|---|
| 昵称 · 档案显示名 · 问答 content · 心情/打卡 note · 成长计划 title/focus · 邀请 display_name · 意象场景自填 | 纯数字字段(生日年月日、分数、经纬度) |
| 长度 · 格式清洗 · XSS/控制字符 · lexicon 硬禁止 · 简易刷屏特征 | 完整内容审核平台 / 人工审 / 语音 |
| 错误码统一 | 改开放登录策略本身 |
---
## 2. 用户价值
1. 避免有害/违规文案入库与进模型。
2. 提交失败时得到可读中文原因。
3. N/A(安全横切,非付费面)。
---
## 3. 用户角色
Visitor / User / Admin 凡提交自由文字均适用(Admin 运营文案可后续加强;本 Spec **先 C 端用户 API**)。
---
## 4. 用户流程
```text
用户输入文字 →(可选)前端即时校验
→ API Handler/Service 调用 textsafe.Check(kind, text)
→ OK:规范化后入库/进模型
→ 拒绝:HTTP 400 · code 40060 · message 可读原因
```
---
## 56. 页面 / 状态
各既有表单;Error 态展示 `message`。无新页面。
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | **后端必须校验**所有用户自由文字;前端校验不得替代后端 |
| R2 | 种类与上限(rune):`nickname` 116`display_name` 124`ask_content` 12000`note` 0200`title` 140`focus` 040`scene` 180 |
| R3 | 拒绝控制字符(允许消息内 `\n` `\t`);拒绝 HTML/脚本片段(如 `<script``javascript:` |
| R4 | 命中 lexicon 硬禁止子串(占卜/算命/改命恐吓/疗效承诺/「测测」品牌自称等)→ 拒绝 |
| R5 | 刷屏特征:连续相同字 ≥8,或可见字符全相同且长度 ≥6 → 拒绝 |
| R6 | 密码字段不做 lexicon,仅拒空字节;手机号走既有数字规则 |
| R7 | 校验通过后写库的是 **Normalize** 后的文本(Trim;压缩首尾空白) |
| R8 | 错误码:`40060`;文案过 lexicon(勿用恐吓语气) |
---
## 8. 数据模型
无新表。进程内可选短时计数(本版刷屏以内容特征为主,不做跨请求配额表)。
---
## 9. API
既有写接口;拒绝时统一:
```json
{ "code": 40060, "message": "文案不合规:…", "data": null }
```
---
## 10. 权限
同各业务接口鉴权;校验在鉴权之后、写库之前。
---
## 11. 埋点
可选:`text_rejected{kind}`(本版可不接)。
---
## 12. 验收
| Given | When | Then |
|---|---|---|
| nickname 含「算命」 | PATCH /auth/me | 40060 |
| ask content 含 `<script` | POST messages | 40060 |
| display_name 正常「小愈」 | POST profile | 200 |
| note=`啊啊啊啊啊啊啊啊` | POST mood | 40060 |
---
## 13. AI 检查
- [x] lexicon
- [x] 后端权威
- [x] 不扩开放登录
---
## 14. Implementation
| 项 | 内容 |
|---|---|
| Package | `apps/api/internal/textsafe` |
| Mirror | `@yuxingu/utils` `validateUserText`(即时提示) |
| Wire | auth · profile · ask · companion · growth · synastry accept |
+189
View File
@@ -0,0 +1,189 @@
# Feature Spec: 身心节律
> Status: `Active` · Map: `2.7 身心节律 [P2]`= `2.5 身心探索` 产品化主入口)· Phase: `P2 Complete`
> 规范:[../feature-design.md](../feature-design.md) · 队列:[P2-BACKLOG.md](P2-BACKLOG.md)
> 竞品对照:命理体系之生活向(能力同构,禁止算命/流年吉凶叙事)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 身心节律 |
| Purpose | 基于出生信息给出五行/体质倾向隐喻与作息·饮食·运动等生活建议 |
| Business Goal | 差异化护城河(数字性格 × 身心);导流节气陪伴与会员 |
| In | Out |
|---|---|
| 元素平衡、体质倾向、本周生活建议 | 流年吉凶、改命、疗效/治病承诺 |
| 与节气生活联动 | 八字/紫微作恐吓主标题 |
| GrowthReport 或 Constitution 聚合 | 医疗诊断 |
**与 2.5** 本 Spec 为身心探索的**唯一产品化主入口**;map 上 2.5 保留能力描述,入口文案统一「身心节律」。
---
## 2. 用户价值
1. **为何需要:** 想知道如何按自己的节奏安排生活,而不只是性格标签。
2. **完成后获得:** 节律概览、元素倾向、今日/本周生活建议;深度版含分维习惯方案。
3. **为何付费:** 完整习惯方案与长期节律计划。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| Visitor+档案 | 基础节律报告 |
| DeepAccess/VIP | detail |
| 无档案 | 引导建档 |
---
## 4. 用户流程
```text
/rhythm 或探索入口
确认 Profile
生成节律报告(元素 · 倾向 · 生活建议)
基础 summary → 深度 detail(会员/深度版)
CTA:节气陪伴 / 问答「生活节奏」/ 分享
```
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/rhythm` | LifeRhythmPageP2 draft |
| `/companion` | 节气联动出口 |
| `/reports/:id` | type=rhythm 详情 |
```text
/rhythm
├── Empty / Loading / Error
├── Normal(基础节律 + 生活建议)
└── Locked
```
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Loading | 分析中 |
| Empty | 无档案引导 |
| Error | 重试 |
| Normal | 维度 + 本周建议 |
| Locked | 深度版 CTA |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 绑定 Profilebirth_date 必填 |
| R2 | 确定性引擎(可参考遗留 yangsheng 思路,**新代码进 monorepo** |
| R3 | summary/detail 权益同画像(Membership DeepAccess |
| R4 | **禁止**:疗效、改善疾病、流年吉凶、改命、算命 |
| R5 | 推荐用语:体质倾向、生活建议、节律、平衡 |
| R6 | 可展示五行隐喻,须标注探索/非医疗 |
| R7 | 与星象性格、个人画像内容可互相链,不互相覆盖主路径 |
| R8 | **体质/五行倾向**随生日确定;**今日/本周生活建议**按**自然日(CST)**刷新(本周焦点随星期变) |
| R9 | GET `/reports/latest` 与 GET `/reports/{id}`type=rhythm):`as_of` ≠ 当日则**原 id 原地更新**时效段并落库;同日即时返回 |
| R10 | `summary``as_of` · `valid_until`(次日 00:00 CST);前端到点静默刷新;**不按十二时辰** |
| R11 | `summary.wuxing` 必含五行分布 `bars`(与愈心解码同源算法)及主/辅倾向;缺字段时 GET 原地补全 |
---
## 8. 数据模型影响
| 项 | 说明 |
|---|---|
| `growth_reports.type` | `rhythm` / `life_rhythm` |
| 或 Constitution 专用表 | 若需独立聚合,实现时 ADR |
| 禁止 | `luck_score`、病名诊断字段 |
| 报告 JSON | `as_of` · `valid_until` · `today_tip` · `week_focus` |
---
## 9. API 需求(草案)
| Method | Path | 意图 |
|---|---|---|
| POST | `/api/v1/reports/rhythm` | profile_id → 报告 |
| GET | `/api/v1/reports/{id}` | 复用 |
| GET | `/api/v1/solar-terms/today` | 页内联动展示(已有) |
---
## 10. 权限设计
| 能力 | 有档案 | 深度权益 |
|---|---|---|
| summary | ✓ | ✓ |
| detail | ✗ | ✓ |
---
## 11. 埋点
| Event | 触发 |
|---|---|
| `rhythm_started` | 开始生成 |
| `rhythm_completed` | 基础结果 |
| `deep_access_clicked` | surface=rhythm |
| `rhythm_to_companion` | 去节气 |
---
## 12. 测试验收标准
**Given** 有生日档案
**When** 生成身心节律
**Then** 含生活建议;无「吉凶」「疗效」「算命」
**Given** 无权益
**When** GET detail
**Then** 剥离
**Given** 文案审查
**When** 扫 summary+detail
**Then** 符合 lexicon
**Given** 已有 rhythm 报告且 `as_of` 为昨日
**When** GET latest
**Then** `today_tip` / `week_focus` 按今日更新;报告 `id` 不变
**Given** 用户停留在 `/rhythm` 跨自然日
**When** 到达 `valid_until`
**Then** 前端静默刷新建议文案
---
## 13. AI 开发前检查
- [x] Spec 齐全 · 与 2.5 关系已写清
- [x] lexicon LifeRhythm
- [x] OpenAPI/erd(编码时)
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| 复用 | ReportRich · membership · companion 节气 · 立项中医体质方向 |
| 参考勿迁 | 根目录 `yangsheng.html` 仅思路参考 |
| Packages | `internal/rhythm` · `LifeRhythmPage` `/rhythm` |
| 实现 | `POST /reports/rhythm` · OpenAPI 已登记 |
| 编码顺序 | P2-BACKLOG 切片 2 Done |
+187
View File
@@ -0,0 +1,187 @@
# Feature Spec: 深度版与成长会员
> Status: `Active` · Map: `§6 商业体系 · §5.3 会员中心 [P1]` · Phase: `P1`
> 规范:[../feature-design.md](../feature-design.md)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 深度版成长报告 + 成长会员 |
| Purpose | 用可理解的权益换取付费;解锁完整分析与更高 Ask 配额 |
| Business Goal | ARPU;验证付费墙与 mock 支付闭环 |
| In | Out |
|---|---|
| 单报告 DeepAccess | 广告干扰主路径 |
| 订阅 Membership(月/季/年 mock | 塔罗商城 |
| 问答额度包 ask_pack(mock) | 与会员深度权益混绑(额度包不加深度版) |
| Server 侧权益生效 | 纯前端「解锁」 |
---
## 2. 用户价值
1. **为何需要:** 基础结果不够用时需要完整分析 / 更多问答。
2. **完成后获得:** 该报告 detail;或会员期内全部报告深度 + Ask 额度提升。
3. **为何付费:** 明确权益清单(完整分析、AI 次数、专属内容占位)。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| Visitor | 可下单 mock 支付 |
| DeepAccess 持有者 | 指定 report 的 detail |
| VIP | 会员期内全局深度 + Ask 配额规则 |
---
## 4. 用户流程
### 深度版(报告内)
```text
报告页 Locked CTA
POST /orders { kind: deep_access, report_id }
POST /orders/{id}/pay-mock
写入 deep_access → 刷新报告 detail 可见
```
### 成长会员
```text
/membership 查看套餐与当前状态
下单 kind=membership + plan
pay-mock → memberships 行 active + expires_at
此后 GET 任意己方报告 detail 可见(按服务规则)
```
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/membership` | MembershipPage |
| 画像/关系/报告内 | Paywall / DeepAccess CTA |
```text
/membership
├── Loading
├── Normal(未开通 / 已开通+到期)
├── Error
└── (无独立 Locked;本身即售卖页)
```
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Loading | 拉取 `/membership/me` |
| Normal | 展示套餐、当前是否会员、到期时间 |
| Error | 重试 |
| 报告 Locked | 深度版入口文案(lexicon:深度版/成长会员,不用「解锁」作主文案) |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | DeepAccess 绑定 `user_id` + `report_id` |
| R2 | Membership active`expires_at > now` |
| R3 | 报告 detail 可见 ⇔ Membership active **OR** DeepAccess 存在 |
| R4 | 支付 P1 仅 mock;成功必须服务端落库后再改可见性 |
| R5 | Ask 配额:免费次数耗尽后可购 ask_pack 或依赖会员配额(见 ask Spec) |
| R8 | `ask_pack`plan=`pack10|pack30|pack100` → 增加 `users.ask_paid_quota_left`;不改变 membership / deep_access |
| R6 | 订单归属必须校验 report 属于当前用户 |
| R7 | 文案:成长会员 / 深度版;禁用恐吓与疗效承诺 |
---
## 8. 数据模型影响
| 表 | 备注 |
|---|---|
| `orders` | kind, amount, status, report_id null |
| `payments` | mock |
| `deep_access` | user_id, report_id, unique |
| `memberships` | plan, expires_at |
---
## 9. API 需求
| Method | Path | 意图 |
|---|---|---|
| GET | `/api/v1/membership/me` | 当前会员状态 |
| POST | `/api/v1/orders` | deep_access \| membership \| ask_pack |
| POST | `/api/v1/orders/{id}/pay-mock` | 生效权益 |
---
## 10. 权限设计
| 能力 | Visitor | DeepAccess | VIP |
|---|---|---|---|
| 看基础报告 | ✓ | ✓ | ✓ |
| 看该报告 detail | ✗ | ✓ | ✓ |
| 看任意己方 detail | ✗ | 仅已购报告 | ✓ |
| 下单 mock | ✓ | ✓ | ✓ |
---
## 11. 埋点
| Event | 触发 |
|---|---|
| `paywall_viewed` | 看到锁定区 |
| `deep_access_clicked` | 点深度版 |
| `membership_plan_clicked` | 选套餐 |
| `order_created` | 下单 |
| `purchase_completed` | pay-mock 成功 |
---
## 12. 测试验收标准
**Given** 无权益报告
**When** pay-mock deep_access
**Then** 再 GET 同报告 detail 非空
**Given** 会员未过期
**When** GET 任意己方 portrait/relation 报告
**Then** detail 可见无需每份 DeepAccess
**Given** 他人 report_id
**When** 尝试下单
**Then** 失败(归属校验)
---
## 13. AI 开发前检查
- [x] Spec 齐全 · map · lexicon · OpenAPI · 可测
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| Packages | `service/order` · `service/membership` · `MembershipPage` |
| Gaps | 真支付网关;发票;退款(须先修订本 Spec §9) |
| Tests | L2 membership unlockMembershipPage.spec |
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · mock 闭环设计闭合 · 实现 PASS · 测试 PASS |
@@ -0,0 +1,156 @@
# Feature Spec: 账户生命周期 / UserStatusOps · ECR-013B
> Status: `Active`**Closed** · Feature Complete)· Map: `§7 运营后台` · Phase: `Ops-D`
> Parent: **WAVE0-FROZEN** (`27f27a1`) · Predecessor: **ECR-013A Closed**
> ESS: `docs/ECR/ECR-013B-account-lifecycle.md`**Closed**
> Capability: `AccountLifecycle` · BC: `Identity_Profile`
> 模板:`docs/WAVE0/contracts/OPS-CONTRACT-TEMPLATE.md`
---
## ESS 门禁
1. Change Level = **L2** → 已 Approved + Coding auth + Implemented + **Closed**
2. ~~Contract Definition only~~ — 已完成
3. 实现证据:`docs/TEST_REPORT/ECR-013B.md` · `docs/CODE_REVIEW/ECR-013B.md`
---
## L0 Capability
| 字段 | 内容 |
|------|------|
| Capability ID | `AccountLifecycle` |
| Purpose | 以可审计状态机管理 C 端用户账户启停与封禁,阻断违规会话 |
| Why now | `users.status` 字段已存在但无运营迁移与强制拒绝;013A 权限面就绪后可挂状态写权限 |
| Non-goals | soft-delete / `deleted`;UGC 社区封禁;真支付;Admin 账号启停(已有 admin.status);推送通知 |
---
## L1 Bounded Context
| 字段 | 内容 |
|------|------|
| Primary BC | `Identity_Profile` |
| owns | `User` · `UserStatus` · `AccountStateTransition` |
| does_not_own | `AdminRole` · `Membership` · `Payment` · `BanRecord`Account_Risk 后置加深) |
| allowed | `Admin_Auth_Audit.write_audit`(经 admin 调用) |
| forbidden | `Payment` · `Membership.write` · soft-delete User |
权威:`.ai/domain/boundary-rules.md` · `Account_Risk` 仅允许经明确服务触发 `UserStatus.transition`
---
## 1. 功能定义
| 字段 | 内容 |
|------|------|
| Name | Account Lifecycle / UserStatus |
| Purpose | 运营可迁移用户状态;非 active 会话在 C 端被拒绝 |
| Business Goal | 风险处置最小闭环,不引入社区/UGC |
| In | Out |
|---|---|
| 状态机 `active/disabled/banned/suspended` | soft-delete / GDPR 擦除 |
| Admin 迁移 API + AuditLog + Transition 记录 | 站内推送 / 短信 |
| DeviceAuth / Bearer 对非 active 拒绝 | AdminAccount.status013A 外) |
| 权限码 `admin.users.status.write` | 行级数据 ACL |
---
## L2 Domain
| Entity | 不变式 / 状态机 |
|--------|----------------|
| `UserStatus` | 取值冻结:`active` · `disabled` · `banned` · `suspended`;非法值拒写 |
| `User.status` | 与 `UserStatus` 同值;默认 `active`(已有列) |
| `AccountStateTransition` | 只追加;记录 from→to · admin_id · reason · created_at |
### 合法迁移
```text
active → disabled | banned | suspended
disabled → active | banned
suspended → active | banned | disabled
banned → active | disabled
```
其它边 → **400**。同状态写 → **400**(幂等拒绝,避免空审计噪音)。
### C 端效应
| Status | DeviceAuth / 已登录 Bearer |
|--------|------------------------------|
| `active` | 放行 |
| `disabled` / `banned` / `suspended` | **401**(或 403 统一码,实现轮定一)+ 不可发新 session |
---
## L3 API Contract(意图 · 实现轮同步 OpenAPI)
前缀:`/api/v1/admin` · AdminAuth · 信封 `{code,message,data}`
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| POST | `/users/:id/status` | `admin.users.status.write` | 迁移 UserStatus;写 Transition + AuditLog |
| GET | `/users/:id/status-transitions` | `admin.users.read` | 最近迁移列表(limit |
既有 `GET /users` · `GET /users/:id` 已暴露 `status` — 保持;实现轮确认枚举文档化。
`contract_diff``docs/CONTRACT_DIFF/ECR-013B.yaml`
RBAC catalog **additive**`admin.users.status.write` → 种子写入 `super_admin`migration)。
---
## L4 Acceptance Criteria
### Functional
| ID | Given | When | Then |
|----|-------|------|------|
| AC-F-01 | 用户 `active` | POST status=`banned` + reason | 200GET user.status=`banned` |
| AC-F-02 | 用户 `banned` | POST status=`active` | 200;可再次 DeviceAuth |
| AC-F-03 | 非法边(如 `active``active` | POST | **400** |
| AC-F-04 | GET status-transitions | — | 含最近 from/to/admin/reason |
### Security
| ID | Given | When | Then |
|----|-------|------|------|
| AC-S-01 | Admin 无 `admin.users.status.write` | POST status | **403** + deny audit |
| AC-S-02 | 用户 `banned` | C 端带原 Bearer 访问受保护 API | **401/403** |
| AC-S-03 | 仅 DeviceAuth 无 Admin | POST `/admin/users/:id/status` | **401** |
| AC-S-04 | 无 Admin session | GET transitions | **401** |
### Performance
| ID | Given | When | Then |
|----|-------|------|------|
| AC-P-01 | transitions ≤1000 行/用户 | GET transitions limit=50 | 本机 P95 **&lt; 500ms** |
### Observability
| ID | Given | When | Then |
|----|-------|------|------|
| AC-O-01 | 迁移成功 | — | AuditLog action=`users.status.transition` |
| AC-O-02 | 迁移成功 | — | `account_state_transitions` 有对应行 |
---
## Forbidden(本切片)
- soft-delete / `deleted` 状态
- 真支付 · UGC · Prompt · 兑换码 · Crisis 深化
- 改 Admin RBAC 模型(仅 **additive** 一枚 permission
- 自动开下一 ECR
---
## Implementation Notes(实现轮才执行)
| 项 | 内容 |
|----|------|
| Migration | YEStransitions 表;permission 种子;必要时 CHECK/注释枚举) |
| Packages | service account/lifecycle · DeviceAuth/session 拒绝 · admin handler · admin-h5 用户详情最小 CTA |
| Depends | ECR-013A Closedpermission middleware |
+226
View File
@@ -0,0 +1,226 @@
# Feature Spec: 运营后台(Ops Admin
> Status: `Active` · Map: `§7 运营后台 [Ops · Phase A]` · Phase: `Ops-A`
> 规范:[../feature-design.md](../feature-design.md)
> 对标推导参考:`cece-frontend-re/complete-design/40-ops-commerce.md`(IA 全量;本 Spec 只交付 Phase A
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 运营后台 |
| Purpose | 让内部运营/客服在受控权限下查询用户与商业数据,并做可审计的会员权益干预 |
| Business Goal | 支撑 P1 用户侧交付后的日常运维;避免直接改库 |
| InPhase A | Out(后置) |
|---|---|
| 管理员账号登录 / 会话 | UGC 审核 · 达人 · 推送任务 |
| 用户列表 / 详情(档案摘要) | 首页运营位 / 工具配置 CMS |
| 订单列表 | 优惠券 · 退款工单流 |
| 成长会员只读 + **授予/延长**(mock 履约) | 真支付渠道配置 |
| 操作审计日志 | 真支付渠道配置 |
| `apps/admin-h5` 桌面友好壳 | 小程序后台 |
> Phase EECR-010):RBAC / 封禁 / 推送占位见 [ops-system.md](ops-system.md)。
---
## 2. 用户价值
1. **为何需要:** P1 已有用户/会员/订单,无控制台则只能改库,风险高。
2. **完成后获得:** 可检索用户、看会员与订单、安全授予会员并留痕。
3. **为何付费:** N/A(内部工具)。
---
## 3. 用户角色
| Actor | 说明 | 本功能能力 |
|---|---|---|
| Guest / Visitor | 终端用户身份 | **无**后台入口 |
| User / VIP | 终端用户 | **无** |
| AdminPhase A | `admin_accounts` 账号 | 登录;读写本 Spec In 范围 API |
| 运营/审核/客服分角色 | 后置 | Phase A 全部等同 Admin |
---
## 4. 用户流程
```text
打开 admin-h5
未登录 → /login(用户名+密码)
↓ POST /api/v1/admin/auth/login
↓ 存 token → 壳布局
用户列表 / 订单 / 审计
↓ 点用户 → 详情(档案数 · 会员 · 近单)
↓ [可选] 授予会员 → 写 memberships + audit_logs
失败:401 回登录;403/5xx 页内错误态
```
---
## 5. 页面设计
| 路由 | 页面 | 说明 |
|---|---|---|
| `/login` | LoginPage | 无壳 |
| `/` | UsersPage | 用户列表 |
| `/users/:id` | UserDetailPage | 用户详情 + 授予会员 |
| `/orders` | OrdersPage | 订单列表 |
| `/audit` | AuditPage | 审计日志 |
```text
AdminShell
├── Nav: 用户 | 订单 | 审计 | 退出
└── Outlet
```
对照:不进入 user-h5 `page-tree`;独立 `apps/admin-h5`
---
## 6. 页面状态
| 页 | Loading | Empty | Error | Normal | Locked |
|---|---|---|---|---|---|
| Login | 提交中 | — | 账号错误 | 表单 | — |
| Users | 表格骨架 | 无用户 | 拉取失败 | 分页列表 | 未登录→登录 |
| UserDetail | 骨架 | 用户不存在 | 失败 | 摘要+操作 | — |
| Orders / Audit | 同 Users | 无记录 | 失败 | 列表 | — |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 管理员鉴权与终端 `DeviceAuth` **隔离**;禁止用 `X-Device-Key` 访问 `/admin/*` |
| R2 | 除 `POST /admin/auth/login` 外,admin API 必须带有效 Admin Token |
| R3 | 用户列表默认按 `created_at DESC`;支持 `q` 精确匹配 `users.id`UUID |
| R4 | 授予会员:`plan ∈ {month,quarter,year}`;写入/更新 `memberships``active``expires_at` 按套餐延长;**必须**写 `admin_audit_logs` |
| R5 | Phase A **不**提供封禁/注销(避免误伤;后置) |
| R6 | Bootstrap:仅当 `admin_accounts` 为空且配置了 bootstrap 密码时,启动可种子一个超级管理员 |
| R7 | 审计日志只追加,不可通过 API 删除/篡改 |
| R8 | 文案用愈心谷 lexicon;UI 不出现竞品品牌词 |
---
## 8. 数据模型影响
新增表(见 `.ai/domain/erd.md`):
- `admin_accounts` — 管理员账号(password_hash
- `admin_sessions` — 会话 token
- `admin_audit_logs` — 操作审计
复用只读:`users` · `profiles` · `memberships` · `orders`
---
## 9. API 需求
前缀:`/api/v1/admin`
| Method | Path | 意图 |
|---|---|---|
| POST | `/auth/login` | 登录,返回 token + account |
| POST | `/auth/logout` | 注销当前会话 |
| GET | `/me` | 当前管理员 |
| GET | `/stats` | 仪表盘概览计数 |
| GET | `/users` | 列表 `?q=` 支持 UUID / 手机 / 昵称 |
| GET | `/users/:id` | 详情(档案 · 报告 · 会员 · 问答额度 · 近订单) |
| POST | `/users/:id/membership/grant` | 授予/延长会员 |
| POST | `/users/:id/ask-quota/grant` | 增加已购问答额度 `{delta}` |
| GET | `/orders` | 订单列表 |
| GET | `/audit-logs` | 审计列表 |
信封仍为 `{code,message,data}`。细节同步 OpenAPI。
---
## 10. 权限设计
| 能力 | Admin Phase A |
|---|---|
| 登录 / me / logout | ✓ |
| 用户读 | ✓ |
| 订单读 | ✓ |
| 授予会员 | ✓ |
| 审计读 | ✓ |
| 改用户 status / 删数据 | ✗ |
---
## 11. 埋点
| event | 属性 |
|---|---|
| `admin_login` | ok / fail_reason |
| `admin_user_view` | user_id |
| `admin_membership_grant` | user_id, plan |
| `admin_page_view` | route |
Phase A 可先 `console`/本地;不挡验收。
---
## 12. 测试验收标准
| # | Given / When / Then |
|---|---|
| T1 | 无 token 调 GET `/admin/users` → 401 |
| T2 | 正确账号登录 → 200 + token;错密 → 非 0 code |
| T3 | 登录后列表可见已有 users |
| T4 | grant membership → memberships active + audit 一条 |
| T5 | admin-h5:登录 → 用户列表 → 详情 → 授予 → 审计页可见 |
---
## 13. AI 开发前检查
- [x] 有 Active Spec(本文件)
- [x] feature-map §7 已挂
- [x] ERD / API 意图已写
- [x] In/Out 边界清晰(无 UGC/达人)
- [x] ECR-006 Approved + BACKEND_DESIGN
- [x] 实现后过 DoD + Review Report
---
## Review ReportPhase A
- Feature: 运营后台 Phase A
- Scope label: **Feature Complete**Ops-A;非 P1 Complete 扩展)
- Architecture: PASS — admin 与 DeviceAuth 隔离;H→S→R
- API: PASS — `/api/v1/admin/*` + OpenAPI
- Security: PASS — bcrypt · session token · 审计
- Test: PASS — `TestAdminOpsPhaseA` · `TestPlanDays` · `build:admin`
- Known Issues: SDK 未并入 adminRBAC/CMS 后置
---
## 分期
| Phase | 内容 |
|---|---|
| **A(本 ECR** | 登录 · 用户 · 订单 · 授予会员 · 审计 · admin-h5 壳 |
| **BECR-007 Closed** | 自有埋点 · 管理端「数据」看板 — Spec `ops-analytics.md` |
| **CECR-008 Closed** | 首页宫格 CRUD · 测评上下架 — Spec `ops-content.md` |
| **EECR-013A Closed** | Admin RBAC — Spec `ops-rbac.md` · Parent WAVE0-FROZEN |
| **FECR-013B Closed** | AccountLifecycle — Spec `ops-account-lifecycle.md` |
| **GECR-014 Closed** | MembershipPlan — Spec `ops-membership-plan.md` |
| **HECR-015 Closed** | RedemptionCode — Spec `ops-redemption-code.md` |
| **IECR-016 Closed** | UserIntelligence — Spec `ops-user-intelligence.md` |
| **JECR-017 Closed** | AskOperations — Spec `ops-ask-operations.md` |
| **KECR-018 Closed** | Entitlement — Spec `ops-entitlement.md` |
| **LECR-019 Closed** | ContentSafety FilterRule — Spec `ops-content-safety.md` |
| **MECR-020 Closed** | QualityFeedback — Spec `ops-quality-feedback.md` |
| **NECR-021 Closed** | AICoreConfig SystemPrompt — Spec `ops-ai-core-config.md` |
| **OECR-022 Closed** | CrisisCare CrisisPolicy — Spec `ops-crisis-care.md` |
| 后置 | Knowledge·Tools 写面 / CrisisEvent / 真支付(Loop 续跑) |
| D | 订单筛选 · 展示价 · 退款只读(另开 ECR) |
| 后置 | 封禁加深(Account_Risk)· 推送占位 |
@@ -0,0 +1,41 @@
# Feature Spec: AICoreConfig · SystemPromptOps · ECR-021
> Status: `Active`Loop continuous · **ECR-021 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-020 Closed
> Capability: `AICoreConfig` · BC: `Ask_Ops`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
Prompt 在线编辑/发布 · KnowledgeSource/Chunk · ToolDefinition · 切换运行时引擎 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `SystemPrompt` | code 唯一;body 为模板文本;active/system;本切片只读 |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/ai/system-prompts` | `admin.ai_config.read` | 列表 |
| GET | `/admin/ai/system-prompts/:id` | 同上 | 详情(含 body) |
## Migration
`000022``system_prompts` + 种子 `ask_default` + 授予权限
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含 ask_default |
| AC-F-02 | get 返回 body 非空 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无 ai_config.read → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-021.yaml`
+156
View File
@@ -0,0 +1,156 @@
# Feature Spec: 运营行为分析(Ops-B
> Status: `Active` · Map: `§7 运营后台` · Phase: `Ops-B`
> ESS`docs/ECR/ECR-007-ops-analytics.md`**Closed** · L2)· BD-2026-007 Approved
> 关联:[ops-admin.md](ops-admin.md) · [analytics.md](analytics.md) · [cece-frontend-re/complete-design/40-ops-commerce.md](cece-frontend-re/complete-design/40-ops-commerce.md)
---
## ESS 门禁
按本仓 `docs/PROJECT_RULES.md` + ESS `CHANGE_MANAGEMENT.md`
1. Change Level = **L2** → ECR Approved + Feature Spec Active + BACKEND_DESIGN Approved — **已满足(2026-08-07**
2. 实现顺序以 `docs/ENGINEERING_SPEC/ECR-007-ops-analytics.md` 为准
3. 完成后:TEST_REPORT · CODE_REVIEW · `ess-validate --phase review` · DoD Review Report
(与 ECR/BACKEND_DESIGN 冲突时以已 Approved 的 ESS 工件为准。)
---
## 1. 目标
按**传统 App 运营**模式:
1. **采集**:页浏览、点击、停留时长、会话退出页等
2. **落库**:自有管道(可与 GA4 双写)
3. **展示**:管理端「数据」看板(DAU、页面、退出页、漏斗)
4. **分期**:先 Ops-B 分析,再内容 / 商业 / 权限全量模块
---
## 2. 分期总览
| 分期 | 主题 | 交付 |
|---|---|---|
| Ops-A | 已完成 | 登录 · 用户 · 订单 · 会员授予 · 审计 · 概览图 |
| **Ops-B** | **行为分析** | 自有埋点 + 管理端「数据」 |
| Ops-C | 内容运营 | 首页宫格/工具配置 · 测评上下架 |
| Ops-D | 商业加深 | 订单筛选 · 套餐价配置 · 退款只读 |
| Ops-E | 系统 | RBAC · 封禁 · 推送/站内信占位 |
UGC / 达人 / 真支付网关:**更远期**,不在本 Spec 承诺范围。
---
## 3. Ops-B 功能定义
| 字段 | 内容 |
|---|---|
| Name | App 行为分析(采集 + 运营看板) |
| Purpose | 用自有数据回答:谁来了、看了哪、停多久、从哪走、点了什么、漏斗掉哪 |
| Business Goal | 替代「只能看 GA / 改库」;支撑日常运营决策 |
| In | Out |
|---|---|
| session / page_view / page_leave(dwell) / ui_click / session_end(exit_page) | 热力图坐标级精确点击 |
| 漏斗事件写入同一管道 | 实时毫秒大屏 |
| Admin「数据」页聚合 | 用户轨迹录像 |
---
## 4. 采集字典(客户端)
扩展 `apps/user-h5/src/lib/analytics.ts`:通道 A = GA4(可选);通道 B = 自有 `POST /api/v1/analytics/events`
| Event | 触发 | 关键 props |
|---|---|---|
| `session_start` | 冷启动或可见性恢复(节流) | `session_id`, `cold`, `app_ver` |
| `page_view` | `router.afterEach` | `page_path`, `page_title`, `referrer_path` |
| `page_leave` | 路由离开 / `visibilitychange=hidden` / `pagehide` | `page_path`, **`dwell_ms`** |
| `ui_click` | `data-track` 或白名单委托 | `page_path`, `element_id` |
| `session_end` | 超时 / 关页(`sendBeacon` | `session_id`, `duration_ms`, **`exit_page`** |
| 既有漏斗 | 保持 | `home_cta_portrait` 等 |
规则:
- 批量上报(5–10s)+ 退出冲刷
- `session_id``sessionStorage`30min 无互动新开
- **禁止**生日、问答正文、手机号、完整档案 ID 明文
---
## 5. 数据模型
```text
analytics_sessions
id, device_key, user_id?, started_at, ended_at, exit_page, duration_ms
analytics_events
id, session_id, user_id?, name, page_path, props jsonb, client_ts, received_at
analytics_daily_page(可选汇总)
day, page_path, pv, uv, dwell_sum_ms, exit_count
```
---
## 6. API
| Method | Path | 意图 |
|---|---|---|
| POST | `/api/v1/analytics/events` | 批量 ingestDeviceAuth,限流) |
| GET | `/api/v1/admin/analytics/overview` | DAU / 会话 / 均时长 |
| GET | `/api/v1/admin/analytics/pages` | 页 PV/UV/avg_dwell/exit |
| GET | `/api/v1/admin/analytics/exits` | 退出页 TOP |
| GET | `/api/v1/admin/analytics/clicks` | 点击 TOP |
| GET | `/api/v1/admin/analytics/funnel` | 漏斗计数 |
查询均带 `from` / `to`(日)。
---
## 7. 管理端「数据」页
侧栏:概览 · **数据** · 用户 · 订单 · 审计
- 时间筛选:今日 / 7 日 / 30 日
- 卡片:DAU、新增、会话数、人均会话时长
- 图:日活趋势;页面均停留 TOP
- 表:页面明细、退出页 TOP、点击 TOP
- 漏斗:探索列表 → 开始作答 → 量表完成 → 画像完成 → 深度 CTA → 支付成功
视觉:愈心谷色系;品牌仅 logo,无「运营后台」字样。
---
## 8. Ops-CE 边界(后置)
| 分期 | In |
|---|---|
| Ops-C | 首页宫格/工具 CRUDscales 上下架 |
| Ops-D | 订单多维筛选;membership 展示价;退款状态只读 |
| Ops-E | 用户封禁;admin 角色;推送任务占位 |
---
## 9. Ops-B 验收
**Given** H5 打开并切换两页后离开
**When** ingest 成功
**Then** 存在 `page_view`×2、`page_leave`(含 dwell_ms)、`session_end.exit_page`
**Given** Admin 登录「数据」近 7 日
**When** GET overview/pages/exits
**Then** 返回非空聚合且与事件量级一致
---
## 10. 实施顺序
1. 本 Spec 置 Active + 改 feature-map §7 / ops-admin 分期
2. Migration + ingest API
3. Admin 聚合 API
4. H5 SDK(会话/停留/点击/beacon
5. admin-h5「数据」页
6. 测试与部署
@@ -0,0 +1,42 @@
# Feature Spec: AskOperationsOps · ECR-017
> Status: `Active`Loop continuous · **ECR-017 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-016 Closed
> Capability: `AskOperations` · BC: `Ask_Ops`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
改写/删除消息正文 · SystemPrompt/Knowledge 配置 · QualityFeedback 写回 · AICoreConfig · 真支付 · UGC
## L2 读模型
| 概念 | 语义 |
|------|------|
| `AskSessionView` | 线程元数据 + message_count(列表) |
| 会话详情 | 只读消息序列(role/content/created_at |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/ask/threads` | `admin.ask.read` | 列表(可选 `user_id` |
| GET | `/admin/ask/threads/:id` | `admin.ask.read` | 会话 meta(不含原文) |
| GET | `/admin/ask/threads/:id/messages` | `admin.ask.transcript.read` | 对话原文(审计 `ask.transcript.read` |
## Migration
`000019`:为 `super_admin` 授予 `admin.ask.read`(无新业务表)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | 有消息线程 → list 含该 thread · message_count≥1 |
| AC-F-02 | detail 返回 user+assistant 消息 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无 ask.read → 403 |
| AC-P-01 | list &lt; 500ms 本机 |
| AC-O-01 | N/A 只读(无写审计强制) |
contract_diff: `docs/CONTRACT_DIFF/ECR-017.yaml`
@@ -0,0 +1,112 @@
# Feature Spec: OpsCMS · Banner 写面(Ops · ECR-041
> Status: `Active`**ECR-041 Closed** · Feature Complete
> Map: `§7 运营后台` · Capability: `OpsCMS` · BC: `Ops_CMS_NoUGC`
> Parent: WAVE0-FROZEN · Write-Wave: `docs/WAVE0/WRITE_WAVE_AUTHORIZATION.md`
> Predecessor: ECR-024 ClosedBanner 只读)
> 关联:[ops-banner.md](ops-banner.md)(只读基线)· [ops-content.md](ops-content.md) · [home.md](home.md)
---
## 1. 目标
让运营可 **创建 / 更新 / 上下架** BannerC 端首页对 `placement=home` 的 active Banner **生效**;写操作鉴权 + 审计;失败可回退静态。
验证 Write-Wave 首刀闭环,**不**做 FeedSlot、真支付、UGC。
## 2. In / Out
| In | Out |
|----|-----|
| AdminBanner create / update / 设 `active` | **FeedSlot** 一切写与 API |
| 加法权限 `admin.cms.write`(既有 RBAC | soft-delete 物理删行(`system=true` 禁止删) |
| C 端:`GET` active banners(至少 `placement=home` | ScheduledPublication 写 · 外链任意 URL |
| 首页推荐区:API Banner 投影优先,空则回退静态 `homeFeeds` | 把 FeedSlot 与 Banner 合并为一 ECR |
| `admin_audit_logs` 记录写操作 | Crisis / Handoff / ContentSafety 写 · 真支付 · UGC |
| OpenAPI · contract_diff · integration | 新权限子系统 · 改引擎分层 |
### 与 `homeFeeds` 的关系(诚实边界)
- ECR-008 将「首页 Feeds CMS」后置;表意信息流位属 **FeedSlot**ECR-025 只读,写面另 ECR)。
- **本切片**:用 **Bannerplacement=home** 驱动首页推荐区展示(投影字段见下);**不**写 `ops_feed_slots`
- 完整 Feeds 槽位运营(多 slot、排期)→ 后续 FeedSlot 写面 ECR。
## 3. Domain
| 概念 | 语义 |
|------|------|
| `Banner` | `code` 唯一;`placement` ∈ {home,explore,ask}`active``system` |
| 写语义 | upsert 字段;`active=false` = 下架;禁止 soft-delete 列/物理删 system 行 |
| C 端投影 | 仅 `active=true`;按 `sort_order` 升序 |
### 首页投影映射(Banner → 原 homeFeeds 卡)
| homeFeeds 字段 | 来源 |
|----------------|------|
| `to` | `link_path`(须站内 `/` 相对路径) |
| `title` | `title` |
| `meta` | 可选:无则空串或固定「运营推荐」 |
| `icon` / `tone` / `stat` / `tag` | 本切片可用缺省;**不**扩表除非 migration 明确(默认缺省,避免 scope creep |
## 4. API
### Admin(既有前缀 `/api/v1/admin/cms`
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/banners` · `/banners/{id}` | `admin.cms.read` | 保持 ECR-024 |
| POST | `/banners` | `admin.cms.write` | 创建(code 唯一) |
| PUT | `/banners/{id}` | `admin.cms.write` | 更新 title/placement/image_url/link_path/sort_order/active |
| — | DELETE | — | **不做**(下架用 `active=false` |
校验:`link_path` 若非空须以 `/` 开头、禁 `http(s):``placement` 枚举;`system=true` 行不可改 `code`、不可删。
### C 端
| Method | Path | Auth | 语义 |
|--------|------|------|------|
| GET | `/api/v1/home/banners` | DeviceAuth(与 `/home/tools` 同级) | 仅 `active`query `placement` 默认 `home` |
## 5. Permission / Audit
- Migration 授予 `super_admin``admin.cms.write`(加法码,非新 RBAC 模型)。
- 每次 POST/PUT 写 `admin_audit_logs`actor · action · target id/code · diff 摘要)。
## 6. Migration
- 若仅需权限种子:`000051_ops_banner_write`(以 TRACEABILITY Max+1 为准,编码时再锁)。
- **表结构**:默认复用 `ops_banners`;本切片 **不**为 FeedSlot 改表。若投影缺省不够且 Human 未扩 scope,不得私自加列。
## 7. UI
| 端 | 行为 |
|----|------|
| admin-h5 `/cms` | Banner 列表 + 新建/编辑/上下架(只动 Banner;FeedSlot 仍只读展示可保留) |
| user-h5 首页 | `GET /home/banners` → 推荐区;失败或空 → 静态 `homeFeeds` |
## 8. AC
| ID | Then |
|----|------|
| AC-F-01 | POST 合法 Banner → list/get 可见 |
| AC-F-02 | PUT `active=false` → C 端 list 不含 |
| AC-F-03 | PUT `active=true` + placement=home → `GET /home/banners` 含该项 |
| AC-F-04 | 重复 `code` → 4xx |
| AC-F-05 | 非法 `link_path`(外链)→ 4xx |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 仅 read 无 write → POST/PUT 403 |
| AC-A-01 | 写操作产生审计行 |
| AC-C-01 | H5 首页:有 active home Banner 时推荐区非纯静态 |
| AC-C-02 | API 失败时首页不白屏(回退静态) |
| AC-O-01 | 不触碰 FeedSlot 写路径 · 无 soft-delete · 无支付 |
## 9. Non-goalsSTOP 对齐)
FeedSlot 写 · ScheduledPublication 写 · UGC · 真支付 · soft-delete · Crisis/Handoff/ContentSafety 写 · 扩大为本 ECR 合并多概念。
## 10. Trace
- ECR: `docs/ECR/ECR-041-banner-write.md`
- BD: `docs/BACKEND_DESIGN/BD-2026-041-banner-write.md`
- PRODUCT_SPEC · CONTRACT_DIFF · TEST_REPORT · CODE_REVIEW(实现阶段)
- Auth: `docs/WAVE0/WRITE_WAVE_AUTHORIZATION.md`
+42
View File
@@ -0,0 +1,42 @@
# Feature Spec: OpsCMS · BannerOps · ECR-024 只读基线)
> Status: `Active`**ECR-024 Closed** · 只读)
> Parent: WAVE0-FROZEN · Predecessor: ECR-023 Closed
> Capability: `OpsCMS` · BC: `Ops_CMS_NoUGC`
> 授权(只读队列):`docs/WAVE0/LOOP_AUTHORIZATION.md`
> **写面:** [ops-banner-write.md](ops-banner-write.md)**ECR-041** · Write-Wave
## Non-goals(本只读 Spec
Banner 写发布(见 ECR-041)· FeedSlot · ScheduledPublication · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `Banner` | code 唯一;placement ∈ {home,explore,ask}active/system;本切片只读 |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/cms/banners` | `admin.cms.read` | 只读 |
| GET | `/admin/cms/banners/{id}` | `admin.cms.read` | 只读 |
## Migration
`000025`:表 + 种子(若有) + 授予 admin.cms.read
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-024.yaml`
@@ -0,0 +1,41 @@
# Feature Spec: ContentSafety · BlockPolicyOps · ECR-029
> Status: `Active`Loop continuous · **ECR-029 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-028 Closed
> Capability: `ContentSafety` · BC: `Content_Safety`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
策略写发布 · 用户侧硬拦截上线 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `BlockPolicy` | 本切片只读目录;code 唯一(若适用) |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/content-safety/block-policies` | `admin.content_safety.read` | 只读 |
| GET | `/admin/content-safety/block-policies/{id}` | `admin.content_safety.read` | 只读 |
## Migration
`000030`:表 + 种子(若有)(权限复用)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-029.yaml`
+48
View File
@@ -0,0 +1,48 @@
# Feature Spec: 运营商业加深(Ops-D
> Status: `Active` · Map: `§7 Phase D` · Phase: `Ops-D` · ECR: `ECR-009`
> 规范:[../feature-design.md](../feature-design.md)
> 上游:Ops-A/B/CECR-006/007/008
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | 运营商业加深 Ops-D |
| Purpose | 订单可筛选;套餐展示价可配;退款状态只读可见 |
| Business Goal | 运营无需改库即可查单与维护展示价 |
| In | Out |
|---|---|
| 订单筛选:status / kind / fromto / user_id | 真支付 · 退款工单流转 |
| `refund_status` 只读字段 | 优惠券 · 发票 |
| 会员套餐展示价 CRUD(分) | RBACOps-E |
---
## 2. 验收
**Given** 库内多状态订单
**When** `GET /api/v1/admin/orders?status=paid&kind=membership&from=&to=`
**Then** 仅返回匹配项,且含 `refund_status`
**Given** Admin 配置 `monthly` 展示价
**When** `PUT /api/v1/admin/membership/plan-prices`
**Then** `GET` 返回新价;不改历史 `orders.amount_cents`
---
## 3. 页面
| 路由 | 说明 |
|---|---|
| `/orders` | 增加筛选条 + 退款状态列 |
| `/pricing` | 套餐展示价表 |
---
## 4. 非目标
真支付网关 · 退款执行 · Ops-E 权限矩阵 · UGC
@@ -0,0 +1,42 @@
# Feature Spec: ContentSafety · FilterRuleOps · ECR-019
> Status: `Active`Loop continuous · **ECR-019 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-018 Closed
> Capability: `ContentSafety` · BC: `Content_Safety`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
ModerationCase 写回 · CrisisPolicy 配置 · 真 NLP/厂商审核 · UGC · 真支付 · 用户侧硬拦截上线(本切片仅运营只读 + 试匹配)
## L2 Domain
| 概念 | 语义 |
|------|------|
| `FilterRule` | code 唯一;category ∈ {crisis,abuse,spam,pii}action ∈ {flag,block,escalate}system 种子不可本切片删除 |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/content-safety/filter-rules` | `admin.content_safety.read` | 列表 |
| GET | `/admin/content-safety/filter-rules/:id` | 同上 | 详情 |
| POST | `/admin/content-safety/evaluate` | 同上 | 试匹配(不写工单) |
## Migration
`000020``filter_rules` + 种子规则 + 授予 `admin.content_safety.read`
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含 system 种子 ≥1 |
| AC-F-02 | evaluate 命中种子 pattern → matches 非空 |
| AC-F-03 | get 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无 content_safety.read → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | evaluate 不写 Audit(只读试匹配) |
contract_diff: `docs/CONTRACT_DIFF/ECR-019.yaml`
+92
View File
@@ -0,0 +1,92 @@
# Feature Spec: 运营内容配置(Ops-C
> Status: `Active` · Map: `§7 运营后台` · Phase: `Ops-C`
> ESS`docs/ECR/ECR-008-ops-content.md`**Closed** · L2)· BD-2026-008 Approved
> 关联:[ops-admin.md](ops-admin.md) · [ops-analytics.md](ops-analytics.md) · [home.md](home.md) · [explore-test.md](explore-test.md)
---
## ESS 门禁
1. Change Level = **L2** → ECR Approved + Feature Spec Active + BACKEND_DESIGN Approved — **已满足(2026-08-07**
2. 实现顺序以 `docs/ENGINEERING_SPEC/ECR-008-ops-content.md` 为准
3. 完成后:TEST_REPORT · CODE_REVIEW · `ess-validate --phase review`
---
## 1. 目标
让运营在后台配置:
1. **首页宫格工具**:增删改排序、显隐、角标(替代写死 `homeCatalog.ts`
2. **测评上下架**`scales.status` = `published` / `draft`C 端列表只见已发布
---
## 2. In / Out
| In | Out |
|---|---|
| 首页宫格 CRUD(最多约 24 项;默认 12) | 首页 Feeds/推荐区运营:ECR-008 后置;**Banner 写面见 ECR-041**;完整 FeedSlot 写另 ECR |
| 工具 path / icon 白名单校验 | 任意外链、自定义 SVG 上传 |
| scales 列表 + 上架/下架 + 审计 | 新建量表题目编辑器 · 探索目录全量 CMS |
| Admin「内容」页 | RBAC / 封禁 / 推送(Ops-E |
---
## 3. 数据模型
```text
home_tools
id, row_index (1|2), sort_order, path, icon, label,
badge?, badge_tone? (hot|new|null), enabled, updated_at
scales(已有)
status: published | draft
```
种子:与当前 `homeGridRow1/2` 一致。
---
## 4. API
| Method | Path | 意图 |
|---|---|---|
| GET | `/api/v1/home/tools` | C 端宫格(仅 enabledDeviceAuth |
| GET | `/api/v1/admin/home/tools` | 管理端全量 |
| PUT | `/api/v1/admin/home/tools` | 整表替换保存(排序+字段)+ 审计 |
| GET | `/api/v1/admin/scales` | 全部量表(含 draft |
| PATCH | `/api/v1/admin/scales/:id` | `{ status }` + 审计 |
C 端既有 `GET /scales` 继续只返回 published。
---
## 5. 管理端「内容」页
侧栏:概览 · 数据 · **内容** · 用户 · 订单 · 审计
- Tab「首页宫格」:两行列表、拖拽/上下移、编辑 label/path/icon/badge、启用开关、保存
- Tab「测评」:列表 · 上架/下架
---
## 6. C 端行为
- `useHomePage` 优先拉 `GET /home/tools`;失败回退静态 `homeCatalog`
- 下架 scale:列表不可见;直链 slug 返回 404/不可用(与现 Get 行为对齐)
---
## 7. 验收
**Given** Admin 将某宫格 disabled 并保存
**When** H5 刷新首页
**Then** 该项不出现
**Given** Admin 将 `mbti-lite` 置 draft
**When** GET `/scales`
**Then** 列表不含该 slug
---
@@ -0,0 +1,42 @@
# Feature Spec: CrisisCare · CrisisPolicyOps · ECR-022
> Status: `Active`Loop continuous · **ECR-022 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-021 Closed
> Capability: `CrisisCare` · BC: `Content_Safety`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
CrisisEvent 入库工单 · InterventionOutcome · 策略在线编辑 · 医疗诊断结论 · UGC · 真支付 · 用户侧硬熔断上线
## L2 Domain
| 概念 | 语义 |
|------|------|
| `CrisisPolicy` | code 唯一;severity ∈ {high,critical}action ∈ {escalate,block,show_helpline}helpline_text 可选;本切片只读 |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/crisis/policies` | `admin.crisis.read` | 列表 |
| GET | `/admin/crisis/policies/:id` | 同上 | 详情 |
| POST | `/admin/crisis/evaluate` | 同上 | 试匹配(不写 CrisisEvent |
## Migration
`000023``crisis_policies` + 种子 + 授予权限
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含 system 种子 ≥1 |
| AC-F-02 | evaluate 命中 pattern → matches 非空 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无 crisis.read → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | evaluate 不写 Audit/Event |
contract_diff: `docs/CONTRACT_DIFF/ECR-022.yaml`
@@ -0,0 +1,41 @@
# Feature Spec: CrisisCare · CrisisEventOps · ECR-031
> Status: `Active`Loop continuous · **ECR-031 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-030 Closed
> Capability: `CrisisCare` · BC: `Content_Safety`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
事件写入工单流 · 医疗诊断 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `CrisisEvent` | 本切片只读目录;code 唯一(若适用) |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/crisis/events` | `admin.crisis.read` | 只读 |
| GET | `/admin/crisis/events/{id}` | `admin.crisis.read` | 只读 |
## Migration
`000032`:表 + 种子(若有)(权限复用)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-031.yaml`
@@ -0,0 +1,36 @@
# Feature Spec: EntitlementOps · ECR-018
> Status: `Active`Loop continuous · **ECR-018 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-017 Closed
> Capability: `CommerceEntitlement` · BC: `Membership_Orders`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
真支付 · 改订单/退款 · 新建权益矩阵表 · UGC · 改报告正文 · ask_pack SKU
## L2 读模型(无 migration
| 概念 | 来源 |
|------|------|
| `Entitlement` | Membership + DeepAccess 列表 + ask_paid_quota 聚合 |
| flags | `report_detail_via_membership` · `deep_access_count` |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/users/:id/entitlements` | `admin.users.read` | 用户权益只读视图 |
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | 授予会员后 flags.report_detail_via_membership=true |
| AC-F-02 | 有 deep_access 时 deep_accesses 非空或 count≥1 |
| AC-F-03 | 无会员无深度 → membership.active=false 且 count=0 仍 200 |
| AC-S-01 | 无 Admin → 401 |
| AC-P-01 | GET &lt; 500ms 本机 |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-018.yaml`
@@ -0,0 +1,40 @@
# Feature Spec: OpsCMS · FeedSlot 写面(Ops · ECR-042
> Status: `Active`**ECR-042 Closed**
> Map: `§7` · Capability: `OpsCMS` · BC: `Ops_CMS_NoUGC`
> Write-Wave: `docs/WAVE0/WRITE_WAVE_AUTHORIZATION.md`
> Predecessor: ECR-025 Closed · ECR-041 Closed
## Goal
运营可创建/更新/上下架 FeedSlot;C 端可读 active 槽位;首页主信息流区按 `home.main`(或 placement=home 的 active 槽)显隐;失败回退「仍展示推荐区」。
## In / Out
| In | Out |
|----|-----|
| Admin POST/PUT feed-slots · `admin.cms.write` | Banner 再扩 · ScheduledPublication 写 |
| C 端 GET `/home/feed-slots` | UGC 内容流正文 CMS · soft-delete |
| 首页:无 active home 槽 → 隐藏推荐区;API 失败 → 仍显示 | 真支付 · Crisis/Handoff · 新权限模型 |
## Domain
复用 `ops_feed_slots``code` 唯一 · `slot_key` · `placement` ∈ {home,explore,ask} · `active` · `system`system 不可改 code)。
## API
| Method | Path | Perm |
|--------|------|------|
| GET | `/admin/cms/feed-slots*` | cms.read |
| POST/PUT | `/admin/cms/feed-slots*` | cms.write |
| GET | `/home/feed-slots?placement=home` | DeviceAuth |
无 DELETE;下架 `active=false`
## AC
AC-F create/update/conflict/invalid · AC-S 401/403 · AC-A audit · AC-C 首页显隐与失败回退 · AC-O 无 Banner 合并 / 无 soft-delete
## Migration
无新表;权限已在 `000051`。本切片 **不新增 migration 文件**Max 保持 `000051`)。
+41
View File
@@ -0,0 +1,41 @@
# Feature Spec: OpsCMS · FeedSlotOps · ECR-025
> Status: `Active`Loop continuous · **ECR-025 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-024 Closed
> Capability: `OpsCMS` · BC: `Ops_CMS_NoUGC`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
FeedSlot 写发布 · ScheduledPublication · UGC · 真支付 · Banner 写
## L2 Domain
| 概念 | 语义 |
|------|------|
| `FeedSlot` | 本切片只读目录;code 唯一(若适用) |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/cms/feed-slots` | `admin.cms.read` | 只读 |
| GET | `/admin/cms/feed-slots/{id}` | `admin.cms.read` | 只读 |
## Migration
`000026`:表 + 种子(若有)(权限复用)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-025.yaml`
@@ -0,0 +1,72 @@
# Feature Spec: GrowthInsights · FunnelDefinition 写面(Ops · ECR-047
> Status: `Active`**Implemented · ECR-047 Closed**
> Map: `§7` · Capability: `GrowthInsights` · BC: `Analytics_OpsB`
> Auth: `docs/WAVE0/ECR-047_WRITE_AUTHORIZATION.md`**仅 ECR-047**
> Predecessor: ECR-039 Closed(只读)· ECR-046 Closed
> 关联:[ops-funnel-definition.md](ops-funnel-definition.md)
---
## 1. 目标
运营可 **创建 / 更新 / 上下架** `FunnelDefinition`(漏斗目录);写鉴权 + 审计;**无**新 C 端路由。
**Closed 后立即 STOP**,不自动 ECR-048。
## 2. In / Out
| In | Out |
|----|-----|
| Admin POST/PUT `/admin/analytics/funnel-definitions*` | ReportTemplate 写 |
| 加法 `admin.growth.write` | SystemPrompt · Knowledge · Chunk |
| 复用表 `funnel_definitions` | soft-delete · 真支付 · UGC |
| 审计 | 题干 · Crisis/Handoff |
| | 自动 ECR-048 · 新 C 端路由 |
## 3. Domain
| 字段 | 规则 |
|------|------|
| `code` | 唯一;`^[a-z][a-z0-9_]{1,62}$``system=true` **不可改 code** |
| `title` | 必填 · ≤128 |
| `active` | `false` = 下架(唯一下架手段) |
| `system` | 种子行;禁止物理删除 |
## 4. API
| Method | Path | 权限 |
|--------|------|------|
| GET | `/admin/analytics/funnel-definitions` · `/{id}` | `admin.growth.read` |
| POST | `/admin/analytics/funnel-definitions` | `admin.growth.write` |
| PUT | `/admin/analytics/funnel-definitions/{id}` | `admin.growth.write` |
无 DELETE · 无新 C 端路径。
## 5. Permission / Migration
- Migration `000056_ops_funnel_definition_write`:授予 `super_admin``admin.growth.write`
- 编码时占号(Max=`000055``000056`
## 6. UI
admin-h5 漏斗定义页:列表 + 新建/编辑/上下架。
## 7. AC
| ID | Then |
|----|------|
| AC-F-01 | POST → list/get 可见 |
| AC-F-02 | PUT active=false → list 仍可见且 active=false |
| AC-F-03 | 重复 code → 409 |
| AC-S-01/02 | 401;仅 growth.read → POST 403 |
| AC-A-01 | 写产生审计 |
| AC-O-01 | 无 soft-delete · 无 ReportTemplate/Prompt 写路径 |
## 8. Closed 后
**立即 STOP**。ECR-048 须新 Candidate Review + Human 拍板。
## 9. Trace
ECR-047 · BD-2026-047 · CONTRACT_DIFF · ECR-047_WRITE_AUTHORIZATION
@@ -0,0 +1,42 @@
# Feature Spec: GrowthInsights · FunnelDefinitionOps · ECR-039
> Status: `Active`Loop continuous · **ECR-039 Closed**
> **写面:** [ops-funnel-definition-write.md](ops-funnel-definition-write.md)**ECR-047 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-038 Closed
> Capability: `GrowthInsights` · BC: `Analytics_OpsB`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
漏斗写配置 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `FunnelDefinition` | 本切片只读目录;code 唯一(若适用) |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/analytics/funnel-definitions` | `admin.growth.read` | 只读 |
| GET | `/admin/analytics/funnel-definitions/{id}` | `admin.growth.read` | 只读 |
## Migration
`000040`:表 + 种子(若有)(权限复用)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-039.yaml`
@@ -0,0 +1,41 @@
# Feature Spec: AskOperations · HandoffCaseOps · ECR-033
> Status: `Active`Loop continuous · **ECR-033 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-032 Closed
> Capability: `AskOperations` · BC: `Ask_Ops`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
转人工写流 · 顾问执业 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `HandoffCase` | 本切片只读目录;code 唯一(若适用) |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/ask/handoffs` | `admin.ask.read` | 只读 |
| GET | `/admin/ask/handoffs/{id}` | `admin.ask.read` | 只读 |
## Migration
`000034`:表 + 种子(若有)(权限复用)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-033.yaml`
@@ -0,0 +1,95 @@
# Feature Spec: ExploreConfig · ImageCardDeck 写面(Ops · ECR-045
> Status: `Active`**Implemented · ECR-045 Closed**
> Map: `§7` · Capability: `ExploreConfig` · BC: `Explore_Reports`
> Auth: `docs/WAVE0/ECR-045_WRITE_AUTHORIZATION.md`Human 批准 · **仅 ECR-045**
> Predecessor: ECR-037 Closed(只读)· ECR-044 ClosedRhythm 写)
> 关联:[ops-image-card-deck.md](ops-image-card-deck.md)
---
## 1. 目标
运营可 **创建 / 更新 / 上下架** `ImageCardDeck`(牌组目录);写操作鉴权 + 审计;C 端可读 active deck 并影响 `/cards` 可用性;失败回退「现网可抽」。
**Closed 后立即 STOP**,不自动 ECR-046。
## 2. In / Out
| In | Out |
|----|-----|
| Admin POST/PUT `/admin/explore/image-card-decks*` | **牌面/单卡内容 CRUD** · Star / Rhythm / Scale |
| 复用 `admin.explore.write` | SystemPrompt · Knowledge · Chunk |
| 复用表 `image_card_decks` | soft-delete · 真支付 · UGC |
| C 端 GET active decks | Crisis / Handoff 写 |
| `/cards`:无 active → 空态禁抽卡 CTA;失败 → 回退可抽 | 自动 ECR-046 |
| 审计 | 新权限子系统 |
## 3. Domain
| 字段 | 规则 |
|------|------|
| `code` | 唯一;`^[a-z][a-z0-9_]{1,62}$``system=true` 不可改 code |
| `title` | 必填 · ≤128 |
| `active` | `false` = 下架(唯一下架手段) |
| `system` | 种子行;禁止物理删除 |
## 4. API
### Admin
| Method | Path | 权限 |
|--------|------|------|
| GET | `/admin/explore/image-card-decks` · `/{id}` | `admin.explore.read` |
| POST | `/admin/explore/image-card-decks` | `admin.explore.write` |
| PUT | `/admin/explore/image-card-decks/{id}` | `admin.explore.write` |
无 DELETE。
### C 端
| Method | Path | Auth | 语义 |
|--------|------|------|------|
| GET | `/api/v1/cards/decks` | DeviceAuth | 仅 `active=true`;按 code 排序 |
## 5. C 端生效
| 条件 | user-h5 `/cards` |
|------|------------------|
| ≥1 active | 保持现网抽卡 |
| 成功且 0 active | 「意象牌组暂未开放」空态;禁用抽卡 CTA |
| 请求失败 | **回退**不阻断抽卡 |
## 6. Permission / Migration
- Migration `000054_ops_image_card_deck_write`:幂等确认 `super_admin``admin.explore.write`
- 编码时占号(Max=`000053`
## 7. UI
| 端 | 行为 |
|----|------|
| admin-h5 意象牌组页 | 列表 + 新建/编辑/上下架(仅 Deck) |
| user-h5 `/cards` | 按 §5 |
## 8. AC
| ID | Then |
|----|------|
| AC-F-01 | POST → list/get 可见 |
| AC-F-02 | PUT active=false → C 端不含 |
| AC-F-03 | 有 active → C 端非空 |
| AC-F-04 | 重复 code → 409 |
| AC-S-01/02 | 401;仅 read → POST 403 |
| AC-A-01 | 写产生审计 |
| AC-C-01 | 全下架后空态/禁 CTA |
| AC-C-02 | API 失败回退可抽 |
| AC-O-01 | 无牌面写路径 · 无 soft-delete |
## 9. Closed 后
**立即 STOP**。ECR-046 须新 Candidate Review + Human 拍板。
## 10. Trace
ECR-045 · BD-2026-045 · CONTRACT_DIFF · ECR-045_WRITE_AUTHORIZATION
@@ -0,0 +1,42 @@
# Feature Spec: ExploreConfig · ImageCardDeckOps · ECR-037
> Status: `Active`Loop continuous · **ECR-037 Closed**
> **写面:** [ops-image-card-deck-write.md](ops-image-card-deck-write.md)**ECR-045 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-036 Closed
> Capability: `ExploreConfig` · BC: `Explore_Reports`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
牌组写发布 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `ImageCardDeck` | 本切片只读目录;code 唯一(若适用) |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/explore/image-card-decks` | `admin.explore.read` | 只读 |
| GET | `/admin/explore/image-card-decks/{id}` | `admin.explore.read` | 只读 |
## Migration
`000038`:表 + 种子(若有)(权限复用)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-037.yaml`
@@ -0,0 +1,41 @@
# Feature Spec: CrisisCare · InterventionOutcomeOps · ECR-032
> Status: `Active`Loop continuous · **ECR-032 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-031 Closed
> Capability: `CrisisCare` · BC: `Content_Safety`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
干预写回 · 医疗诊断 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `InterventionOutcome` | 本切片只读目录;code 唯一(若适用) |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/crisis/interventions` | `admin.crisis.read` | 只读 |
| GET | `/admin/crisis/interventions/{id}` | `admin.crisis.read` | 只读 |
## Migration
`000033`:表 + 种子(若有)(权限复用)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-032.yaml`
@@ -0,0 +1,41 @@
# Feature Spec: AICoreConfig · KnowledgeChunkOps · ECR-027
> Status: `Active`Loop continuous · **ECR-027 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-026 Closed
> Capability: `AICoreConfig` · BC: `Ask_Ops`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
Embedding · 上传切块 · 运行时 RAG 接线 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `KnowledgeChunk` | 本切片只读目录;code 唯一(若适用) |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/ai/knowledge-chunks` | `admin.ai_config.read` | 只读 |
| GET | `/admin/ai/knowledge-chunks/{id}` | `admin.ai_config.read` | 只读 |
## Migration
`000028`:表 + 种子(若有)(权限复用)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含种子或空列表合法 |
| AC-F-02 | 已知 id get 200 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无权限 → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-027.yaml`
@@ -0,0 +1,41 @@
# Feature Spec: AICoreConfig · KnowledgeSourceOps · ECR-023
> Status: `Active`Loop continuous · **ECR-023 Closed**
> Parent: WAVE0-FROZEN · Predecessor: ECR-022 Closed
> Capability: `AICoreConfig` · BC: `Ask_Ops`
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
## Non-goals
KnowledgeChunk / Embedding · 源文件上传 · 在线编辑发布 · ToolDefinition · 运行时 RAG 接线 · UGC · 真支付
## L2 Domain
| 概念 | 语义 |
|------|------|
| `KnowledgeSource` | code 唯一;source_kind ∈ {faq,policy,guide}active/system;本切片只读目录,不含 Chunk |
## L3 API
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/ai/knowledge-sources` | `admin.ai_config.read` | 列表 |
| GET | `/admin/ai/knowledge-sources/:id` | 同上 | 详情 |
## Migration
`000024``knowledge_sources` + 种子 `ask_grounding`(权限已由 000022 授予)
## L4 AC
| ID | Then |
|----|------|
| AC-F-01 | list 含 ask_grounding |
| AC-F-02 | get 返回 source_kind 合法 |
| AC-F-03 | 未知 id → 404 |
| AC-S-01 | 无 Admin → 401 |
| AC-S-02 | 无 ai_config.read → 403 |
| AC-P-01 | list &lt; 500ms |
| AC-O-01 | N/A 只读 |
contract_diff: `docs/CONTRACT_DIFF/ECR-023.yaml`

Some files were not shown because too many files have changed in this diff Show More