feat(ECR-012–016): 合规、题库、时辰刷新、头像、MBTI OEJTS 与埋点

落地输入合规、探索题库、报告日/时辰刷新、账号头像、OEJTS 量表,并补齐 H5 埋点与 Admin 漏斗;同步 ESS 工件、切至自建 Git、清理 GitHub Actions。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-13 01:27:58 +08:00
co-authored by Cursor
parent 13860bf1ef
commit 89756f65b4
227 changed files with 7405 additions and 1407 deletions
+40
View File
@@ -0,0 +1,40 @@
# ECR-012
**Title:** 用户文字输入合规(后端 textsafe + 前端镜像)
**Status:** Approved
**Date:** 2026-08-12
**Approved:** 2026-08-12(Human:文字输入全规则;后端为重点)
**Change Level:** L2
## Change
1. Active Spec`.ai/product/feature-spec/input-compliance.md`
2. `internal/textsafe`:长度 · XSS/控制字符 · lexicon · 刷屏特征 · Normalize
3. 挂接 C 端:auth 昵称 · profile 名 · ask content · companion note · growth title/focus/note · synastry invite display_name
4. `@yuxingu/utils` 镜像校验供 H5 即时提示
5. 错误码 `40060`
## Motivation
自由文字缺少统一合规闸门,易进库/进模型。
## Scope
### Allowed
- 上列 Spec / textsafe / 指定 Handler·Service / utils
### Forbidden
- 第三方审核 SaaS · 语音 · 改开放登录 · Ops 全文案重构(可后 ECR)
## Acceptance
- [x] 违规 nickname / ask / note → 40060
- [x] 合法中文名通过
- [x] go test textsafe PASS
- [x] 关键表单前端有即时错误(至少昵称/问答/档案名)
## Trace
Spec `input-compliance` · TASK-012 · TEST_REPORT/ECR-012.md
+41
View File
@@ -0,0 +1,41 @@
# ECR-013
**Title:** 探索 curated 题库(A 集)+ 结果回看
**Status:** Approved
**Date:** 2026-08-13
**Approved:** 2026-08-13Human:探索题库非临床 A 集;完成后只看结果/重测;探索返回)
**Change Level:** L2
## Change
1. Active Spec 更新:`.ai/product/feature-spec/explore-test.md`R8/R13/R14 · 路由)
2. `internal/scalebank`embed curated A 集;Catalog / Category / Get / ScoreSum
3. API`GET /scale-bank/catalog` · `GET /scale-bank/categories/:key`bank slug 走 `GET|POST /scales/:slug(/result)`
4. H5:探索题库精选宫格 + 分类列表页;每量表独立图标;R8 结果回看;探索顶栏返回
5. SDK/types · OpenAPI
## Motivation
探索需可运营的非临床题库入口;与产品向 `mbti-lite` 并存;禁止临床筛查进 C 端。
## Scope
### Allowed
- Spec explore-test · scalebank · scale service/handler · Explore* 页 · useScalePage · HomeToolIcon 题库图标 · AppHeader 探索返回 · sdk/types · openapi
### Forbidden
- 临床类量表上架 · 第三方题库实时抓取进生产 · 改支付/Ops CMS 本 ECR
## Acceptance
- [x] catalog 返回精选 + 四分类;无临床类
- [x] bank slug 可 Get / Submit / LatestResult;二次进入只看结果+重测
- [x] 精选图标互不相同
- [x] `/explore` 显示返回
- [x] go test scalebank + integration TestScaleBankResultRoundtrip · vitest ScalePage · ess-validate coding/review
## Trace
Spec `explore-test` · TASK-013 · BD-2026-013 · TEST_REPORT/ECR-013.md
+53
View File
@@ -0,0 +1,53 @@
# ECR-014
**Title:** 时效刷新契约对齐(首页时辰贴士 · 星座/节律按日)
**Status:** Approved
**Date:** 2026-08-13
**Approved:** 2026-08-13(Human:后台按前端本次时效刷新改动对齐;走 ESS Intake)
**Change Level:** L2
**Retrospective:** true
## Retro(异常路径 — 不得伪装正序)
| Field | Content |
|-------|---------|
| Original drift | 前端已用 `valid_until` / `scheduleRefresh` / 时辰贴士;后台实现先进树,未先挂 Active ECR |
| Scope freeze | 仅本 ECR Allowed 所列;禁止扩到头像、题库、textsafe、Ops |
| Process debt | 倒序实现;CODE_REVIEW 须点名流程债;不得写成「一直按正序 Approved」 |
## Change
1. 对齐 Spec`home.md` R5R8 · `star-profile.md` R12R14 · `life-rhythm.md` R8R11
2. 后台:`home_daily_tips` 缓存 · `shichen`/`valid_until`star/rhythm GET 换日原地刷新 `as_of`/`valid_until`
3. OpenAPI / types 契约与前端 SDK 一致
4. 单测 + 必要 integration
## Motivation
前端静默刷新依赖后端时效字段;无契约收口则易漂移。
## Scope
### Allowed
- `internal/service/home`daily_tips · shichen)· `repository/home_tips_repo` · migration `000023`
- `internal/service/report/temporal*` · Get/Latest 换日刷新
- `proto/openapi.yaml` 相关 schema/描述
- `packages/types` HomeDailyTips / report summary 字段(若缺)
- Spec 已 Active 的上述规则;TEST_REPORT / HANDOFF
### Forbidden
- 头像上传(另 ECR)· scalebank / 临床题库 · textsafe · Admin CMS · 新支付
## Acceptance
- [x] GET `/home/daily-tips``shichen` · `shichen_name` · `valid_until`
- [x] GET star/rhythm latest|id:跨日原地更新 `as_of`,返回 `valid_until`;同日不重算本命层
- [x] OpenAPI 描述与字段一致
- [x] `go test` home + report/temporal PASS
- [x] ess-validate coding PASSCODE_REVIEW 记录 Retro
## Trace
Spec home / star-profile / life-rhythm · TASK-014 · BD-2026-014 · TEST_REPORT/ECR-014.md
+57
View File
@@ -0,0 +1,57 @@
# ECR-015
**Title:** 账号头像上传与媒体读取
**Status:** Approved
**Date:** 2026-08-13
**Approved:** 2026-08-13Human:开 Architect · 头像另 Context
**Change Level:** L2
**Retrospective:** true
## Retro(异常路径)
| Field | Content |
|-------|---------|
| Original drift | Spec `account-auth` R9 与 FE「我的」页、migration `000018`、handler/media/avatar 已先于本 ECR 进树 |
| Scope freeze | 仅头像上传/存储/读取与 `avatar_url` 契约;禁止顺手改昵称规则、登录开放策略、Ops |
| Process debt | 倒序实现;CODE_REVIEW 须点名;不得伪装正序路径 |
## Change
1. 对齐 Spec `account-auth.md` R9 · §8–§10
2. 后台:`users.avatar_url` · `POST /auth/me/avatar` · `GET /media/avatars/:file` · 本地 `data/avatars/`
3. H5:「我的」更换头像(相册/拍照);默认 `public/default-avatar.png`
4. SDK `authUploadAvatar` · types `avatar_url` · OpenAPI
5. 单测(类型/大小校验)+ 冒烟清单
## Motivation
账号展示位需要可换头像;与昵称同属账号资产。
## Scope
### Allowed
- migration `000018_user_avatar`
- `internal/avatar` · `handler` UploadAvatar / MediaHandler
- `service/auth` UpdateAvatar · auth_repo avatar 字段
- H5 MinePage 头像 UI · `defaultAvatar` / `apiAsset`(若缺则补)
- `packages/sdk` · `packages/types` · `proto/openapi.yaml` 头像相关
- Spec account-auth R9TEST / HANDOFF
### Forbidden
- 改 R1 OpenLogin 策略 · textsafe 规则扩 scope · scalebank · 时效刷新(ECR-014)· Admin · 对象存储/CDN 上云(可后 ECR)
## Acceptance
- [x] 已登录 POST multipart jpeg/png/webp ≤2MB → 200 · `avatar_url` 非空
- [x] 超限/错误类型 → 4xx 可读文案
- [x] GET `/media/avatars/:file` 可公开读已存文件;路径穿越拒绝
- [x] GET `/auth/me``avatar_url`;未设置时 H5 显示默认愈心小人
- [x] OpenAPI 覆盖 upload + media
- [x] go test avatar PASSess-validate coding PASS
- [x] CODE_REVIEW 记 RetroReviewer
## Trace
Spec `account-auth` · TASK-015 · BD-2026-015 · TEST_REPORT/ECR-015.md
+49
View File
@@ -0,0 +1,49 @@
# ECR-016
**Title:** MBTI 标准/完整版(OEJTS)题库与计分
**Status:** Approved
**Date:** 2026-08-13
**Approved:** 2026-08-13Human:授权自主 Loop 收口剩余 WIP)
**Change Level:** L2
**Retrospective:** true
## Retro
| Field | Content |
|-------|---------|
| Original drift | migrations 000019022 · jungian/mbti_result · Spec R10R11 已先于本 ECR |
| Scope freeze | 仅 `mbti-lite`/`mbti-full` 题库、计分、会员锁;禁止 scalebank A 集、头像、时效、OpenLogin |
| Process debt | 倒序;CODE_REVIEW 须点名 |
## Change
1. Spec `explore-test` R9R12`mbti-lite` 32 题免费 · `mbti-full` 60 题会员
2. migrations 019022 · soft-delete 旧题/旧结果
3. `ScoreJungian` / `BuildJungianResult`
4. GET locked / POST 403 未会员
5. 单测
## Scope
### Allowed
- `apps/api/migrations/000019``000022`
- `internal/scale` jungian/mbti_result/score
- `service/scale` mbti-lite/full 分支
- OpenAPI 若缺会员锁说明则补
- H5 ScaleIntro 双轨入口(已有则核对)
### Forbidden
- scalebank curated · avatar · temporal · textsafe 改规则 · Admin
## Acceptance
- [x] mbti-lite 32 题 · 四维计分出类型码
- [x] mbti-full 未会员 locked;会员可交
- [x] go test ./internal/scale/ PASS
- [x] ess-validate codingCODE_REVIEW Retro
## Trace
Spec explore-test · TASK-016 · BD-2026-016 · TEST_REPORT/ECR-016.md