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:
@@ -0,0 +1,35 @@
|
||||
# BD-2026-012 — Input text compliance
|
||||
|
||||
Status: Approved
|
||||
**ECR:** ECR-012
|
||||
**Date:** 2026-08-12
|
||||
**Change Level:** L2
|
||||
**Risk:** Low
|
||||
|
||||
## Backend Change Boundary
|
||||
|
||||
### In
|
||||
|
||||
- Package `internal/textsafe`(纯函数,无 DB)
|
||||
- Service/Handler 在写库前 `Check(Kind, s)`
|
||||
- 失败 → `response.Fail(..., 40060, err.Error())`
|
||||
|
||||
### Out
|
||||
|
||||
- 新表 · Redis 限流 · Admin CMS 全量
|
||||
|
||||
## Module
|
||||
|
||||
| Module | Change |
|
||||
|--------|--------|
|
||||
| textsafe | Check / Normalize / Kind |
|
||||
| auth · profile · ask · companion · growth · synastry | 调用 Check |
|
||||
|
||||
## Test
|
||||
|
||||
- 单测:禁止词 · XSS · 刷屏 · 长度 · 合法样本
|
||||
- 可选 integration 抽一条 PATCH nickname
|
||||
|
||||
## Rollback
|
||||
|
||||
- 去掉 Check 调用即可;无 migration
|
||||
@@ -0,0 +1,66 @@
|
||||
# BD-2026-013 — Curated scale bank (explore)
|
||||
|
||||
Status: Approved
|
||||
**ECR:** ECR-013
|
||||
**Date:** 2026-08-13
|
||||
**Change Level:** L2
|
||||
**Risk:** Low–Med(题量大 · 文案非诊断)
|
||||
|
||||
## Backend Change Boundary
|
||||
|
||||
### In
|
||||
|
||||
- Package `internal/scalebank`(embed `curated.json` · Catalog/Category/Get/ScoreSum/QuestionID)
|
||||
- `service/scale`:bank slug Get/Submit/LatestResult;`EnsurePublished` stub 行
|
||||
- `handler/scale`:`/scale-bank/*`
|
||||
- `repository.ScaleRepo.EnsurePublished`
|
||||
|
||||
### Out
|
||||
|
||||
- 新业务表存题目全文(题目仅 embed)· 临床类 · Admin 题库 CMS
|
||||
|
||||
## Module
|
||||
|
||||
| Module | Change |
|
||||
|--------|--------|
|
||||
| scalebank | embed A 集 · 稳定 QuestionID |
|
||||
| scale service | bank 分支计分 BuildResult + disclaimer |
|
||||
| scale handler | catalog / category |
|
||||
| OpenAPI | 上述路径 |
|
||||
|
||||
## Data flow
|
||||
|
||||
```text
|
||||
H5 /explore → GET scale-bank/catalog
|
||||
H5 /explore/bank/:key → GET scale-bank/categories/:key
|
||||
H5 /scales/:slug → Get(bank|db) → optional GET result → POST result
|
||||
Submit bank → EnsurePublished → ScoreSum → BuildResult → SaveResult
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
| Method | Path | Notes |
|
||||
|--------|------|-------|
|
||||
| GET | `/api/v1/scale-bank/catalog` | featured + categories |
|
||||
| GET | `/api/v1/scale-bank/categories/:key` | category + items |
|
||||
| GET/POST | `/api/v1/scales/:slug` / `.../result` | bank slug 同契约 |
|
||||
|
||||
## Migration
|
||||
|
||||
NO(`EnsurePublished` upsert `scales` 元数据行;题目不入库)
|
||||
|
||||
## Test
|
||||
|
||||
- unit:`scalebank` catalog/featured icons unique
|
||||
- integration:`TestScaleBankResultRoundtrip`(sm1)
|
||||
- H5:ScalePage latest result(含 bank slug)
|
||||
|
||||
## Rollback
|
||||
|
||||
- 下线路由 + 回退 Explore UI;已写 `scale_results` 可保留
|
||||
|
||||
## Failure
|
||||
|
||||
- 未知 category → 40402
|
||||
- 无结果 → 40411
|
||||
- 无 Self profile → 提交 400
|
||||
@@ -0,0 +1,46 @@
|
||||
# BD-2026-014 — Temporal refresh (tips · star · rhythm)
|
||||
|
||||
Status: Approved
|
||||
**ECR:** ECR-014
|
||||
**Date:** 2026-08-13
|
||||
**Change Level:** L2
|
||||
**Risk:** Low
|
||||
**Retrospective:** true(实现已部分在树,本 BD 冻结边界)
|
||||
|
||||
## Backend Change Boundary
|
||||
|
||||
### In
|
||||
|
||||
- `home_daily_tips` 表 · HomeDailyTipsRepo · DailyTips 响应装饰时辰窗
|
||||
- report `refreshTemporalIfNeeded` on Get / GetLatest(star|rhythm)
|
||||
- OpenAPI 字段说明
|
||||
|
||||
### Out
|
||||
|
||||
- 头像 · scalebank · 新建报告 id 换日
|
||||
|
||||
## Data flow
|
||||
|
||||
```text
|
||||
GET /home/daily-tips
|
||||
→ CurrentShichen → cache hit? return+decorate : fallback + async LLM warm
|
||||
→ valid_until = next 时辰 start
|
||||
|
||||
GET /reports/latest|/:id (star|rhythm)
|
||||
→ if as_of != today CST → in-place UpdateContent outlook/tips
|
||||
→ stamp valid_until = next midnight CST
|
||||
```
|
||||
|
||||
## Migration
|
||||
|
||||
YES — `000023_home_daily_tips`(若尚未应用则 migrate)
|
||||
|
||||
## Test
|
||||
|
||||
- `TestCurrentShichenBoundaries` · `TestFallbackTipsChangeByShichen`
|
||||
- `temporal_test.go` as_of / valid_until
|
||||
- 可选:手工 GET 冒烟
|
||||
|
||||
## Rollback
|
||||
|
||||
- 停用 refresh 调用;表可保留
|
||||
@@ -0,0 +1,55 @@
|
||||
# BD-2026-015 — Account avatar
|
||||
|
||||
Status: Approved
|
||||
**ECR:** ECR-015
|
||||
**Date:** 2026-08-13
|
||||
**Change Level:** L2
|
||||
**Risk:** Low
|
||||
**Retrospective:** true
|
||||
|
||||
## Backend Change Boundary
|
||||
|
||||
### In
|
||||
|
||||
- `users.avatar_url` (varchar)
|
||||
- Package `internal/avatar`:Store / ResolveAbs · MaxBytes 2MiB · jpeg/png/webp
|
||||
- Auth `POST /me/avatar`(需登录)→ 写盘 + 更新 DB
|
||||
- Public `GET /media/avatars/:file`(无鉴权读)
|
||||
- OpenAPI
|
||||
|
||||
### Out
|
||||
|
||||
- S3/COS · 图片审核 SaaS · 多人头像/档案头像分离
|
||||
|
||||
## Data flow
|
||||
|
||||
```text
|
||||
H5 MinePage → multipart POST /auth/me/avatar
|
||||
→ avatar.Store(data/avatars, userID, file)
|
||||
→ auth_repo SET avatar_url=/api/v1/media/avatars/{user_id}.ext
|
||||
→ return AuthUser
|
||||
|
||||
GET /media/avatars/:file
|
||||
→ ResolveAbs(防 ..)→ File
|
||||
```
|
||||
|
||||
## Migration
|
||||
|
||||
YES — `000018_user_avatar.up.sql`
|
||||
|
||||
## Security
|
||||
|
||||
- 扩展名/Content-Type 白名单
|
||||
- 大小上限 2MB
|
||||
- ResolveAbs 禁止路径穿越
|
||||
- 文件名绑定 user UUID(覆盖旧文件)
|
||||
|
||||
## Test
|
||||
|
||||
- avatar Store 拒超大/拒坏类型
|
||||
- ResolveAbs 拒 `../`
|
||||
- 可选:handler 冒烟
|
||||
|
||||
## Rollback
|
||||
|
||||
- 停用 Upload 路由;列可留;磁盘文件可人工清
|
||||
@@ -0,0 +1,31 @@
|
||||
# BD-2026-016 — MBTI OEJTS lite/full
|
||||
|
||||
Status: Approved
|
||||
**ECR:** ECR-016
|
||||
**Retrospective:** true
|
||||
**Change Level:** L2
|
||||
|
||||
## Boundary
|
||||
|
||||
### In
|
||||
|
||||
- migrations 019–022
|
||||
- jungian scoring · BuildJungianResult
|
||||
- scale service membership gate for mbti-full
|
||||
|
||||
### Out
|
||||
|
||||
- scalebank · 官方 MBTI® 版权题
|
||||
|
||||
## Migration
|
||||
|
||||
YES — 000019 label · 000020 questions · 000021 OEJTS 32 · 000022 full 60
|
||||
|
||||
## Test
|
||||
|
||||
- ScoreJungian / BuildJungianResult unit
|
||||
- optional membership lock
|
||||
|
||||
## Rollback
|
||||
|
||||
- soft-deleted rows remain;可再 seed
|
||||
@@ -1,5 +1,19 @@
|
||||
# CHANGELOG — ESS process artifacts
|
||||
|
||||
## 2026-08-13
|
||||
|
||||
- **Git host:** 远程改为 `https://git.jackyu66.com/jack/digital-psychology.git`;删除 `.github/workflows`(不再使用 GitHub Actions)
|
||||
- **ECR-016 Closed(RETRO)**:MBTI OEJTS lite/full · 自主 Loop
|
||||
- **ECR-015 Closed(RETRO)**:头像 · CODE_REVIEW Approve
|
||||
- **ECR-015 Implemented(RETRO)**:头像单测 + OpenAPI 说明 · TEST_REPORT → reviewer
|
||||
- **ECR-015 Approved(RETRO)**:账号头像 · Architect→Engineer;Scope freeze 不含 OpenLogin/题库/014
|
||||
- **ECR-014 Closed(RETRO)**:时效刷新 FE/BE · CODE_REVIEW Approve(记 Process debt)
|
||||
- **ECR-014 Implementing(RETRO)**:时效刷新 FE/BE · OpenAPI HomeDailyTips · TEST_REPORT → reviewer
|
||||
- **ESS 0.2.0-intake FROZEN:** Implementation Complete / Validation Pending;下一步 Real L2 Pressure(A/B/C),不开 PR2/Loop
|
||||
- **ESS Intake G0:** `$ESS_ROOT` · `SESSION_BOOTSTRAP`;本仓 `ess_intake: strict` · `AGENTS.md` §0 Mode 块
|
||||
- **ECR-013 Closed**:探索 curated 题库 A 集 · R8 回看 · OpenAPI `/scale-bank/*` · CODE_REVIEW Approve
|
||||
- **ECR-012 Closed**:文字输入合规 textsafe / 40060 · CODE_REVIEW Approve
|
||||
|
||||
## 2026-08-12
|
||||
|
||||
- **ECR-011 Closed**:integration TestECR011 PASS;CODE_REVIEW Approve
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# CODE_REVIEW — ECR-012 Input compliance
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**Reviewer:** Agent (ESS REVIEWER)
|
||||
**Verdict:** **Approve**
|
||||
|
||||
## Backend Review
|
||||
|
||||
```text
|
||||
Backend Review:
|
||||
☑ Design Compliance — 对齐 BD-2026-012(textsafe 纯函数 · 写库前 Check)
|
||||
☑ Layer boundary respected — Handler/Service 调用;无 Controller→DB
|
||||
☑ Domain independent
|
||||
☑ Repository used(无新增直连)
|
||||
☑ API contract — 40060;OpenAPI 已注
|
||||
☑ Migration — N/A(无 schema)
|
||||
☑ Observability — 错误码可观测
|
||||
☑ Error handling — textsafe.ErrRejected → 40060
|
||||
☑ Tests included — internal/textsafe + TEST_REPORT 手工/API 表
|
||||
☑ Rollback considered — 去掉 Check 即可
|
||||
☑ No architecture regression
|
||||
☑ Matches Change Boundary
|
||||
☑ Trace — BD-2026-012 · TEST_REPORT/ECR-012.md
|
||||
```
|
||||
|
||||
## Residual(接受)
|
||||
|
||||
- 非第三方审核 SaaS(Spec Out)
|
||||
- Ops CMS 全文案未纳入
|
||||
|
||||
## Decision
|
||||
|
||||
**Approve** → ECR-012 可 Closed(合入时勿带密钥 / test-results)
|
||||
@@ -0,0 +1,33 @@
|
||||
# CODE_REVIEW — ECR-013 Scale bank explore
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**Reviewer:** Agent (ESS REVIEWER)
|
||||
**Verdict:** **Approve**
|
||||
|
||||
## Backend Review
|
||||
|
||||
```text
|
||||
Backend Review:
|
||||
☑ Design Compliance — 对齐 BD-2026-013(embed · EnsurePublished · 无题目录表)
|
||||
☑ Layer boundary respected — Handler → Service → scalebank|Repo
|
||||
☑ Domain independent
|
||||
☑ Repository used — SaveResult / LatestResult / EnsurePublished
|
||||
☑ API contract — OpenAPI `/scale-bank/*` + scales result
|
||||
☑ Migration — N/A(upsert scales 元数据)
|
||||
☑ Observability — 标准 envelope / 40411
|
||||
☑ Error handling — category 404 · result 404 · profile 校验
|
||||
☑ Tests — scalebank unit · TestScaleBankResultRoundtrip · ScalePage vitest
|
||||
☑ Rollback considered
|
||||
☑ No architecture regression — icon allowlist 抽到 lib
|
||||
☑ Matches Change Boundary — 无临床类
|
||||
☑ Trace — BD-2026-013 · TEST_REPORT/ECR-013.md
|
||||
```
|
||||
|
||||
## Residual(接受)
|
||||
|
||||
- 题量较大(50–180)体验可后续 ECR 优化
|
||||
- 工作区另有 tips/星座日刷/头像等 WIP,须另开 ECR,不并入本 Approve
|
||||
|
||||
## Decision
|
||||
|
||||
**Approve** → ECR-013 可 Closed / 合入(勿带 test-results、密钥、scraped 全量原始文件若未纳入)
|
||||
@@ -0,0 +1,63 @@
|
||||
# CODE_REVIEW — ECR-014 Temporal refresh (tips · star · rhythm)
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**Reviewer:** Agent (ESS REVIEWER)
|
||||
**Verdict:** **Approve**
|
||||
**Retrospective:** true
|
||||
|
||||
```text
|
||||
ESS Mode: L2
|
||||
Phase: REVIEWER
|
||||
ECR: ECR-014
|
||||
Action: CONTINUE
|
||||
Forbidden: production code edits this turn
|
||||
```
|
||||
|
||||
## Process debt(强制记录)
|
||||
|
||||
本变更 **实现早于 ECR**(倒序)。TEST_REPORT / HANDOFF 已标明 Retro。
|
||||
**不得**解读为「正序 Approved → Coding」样板路径。Intake 门禁对后续 L2 仍适用。
|
||||
|
||||
## Acceptance ↔ Evidence
|
||||
|
||||
| Acceptance | Evidence | OK |
|
||||
|------------|----------|----|
|
||||
| daily-tips `shichen` / `shichen_name` / `valid_until` | `DailyTips` JSON + `decorateTips` · OpenAPI `HomeDailyTips` | ✓ |
|
||||
| star/rhythm 跨日原地更新 + `valid_until` | `refreshTemporalIfNeeded` on Get/Latest · engines set fields · `temporal_test` | ✓ |
|
||||
| OpenAPI 一致 | `EnvelopeHomeDailyTips` · GrowthReport.summary 说明 | ✓ |
|
||||
| go test | 复跑 home + report **PASS** | ✓ |
|
||||
| ess-validate coding | **PASS** | ✓ |
|
||||
| CODE_REVIEW 记 Retro | 本文 | ✓ |
|
||||
|
||||
## Backend Review
|
||||
|
||||
```text
|
||||
Backend Review:
|
||||
☑ Design Compliance — 对齐 BD-2026-014(cache 时辰 · GET 换日原地 UpdateContent · 不新开报告 id)
|
||||
☑ Layer boundary respected — Handler → Service → Repo
|
||||
☑ Domain independent
|
||||
☑ Repository used — HomeDailyTipsRepo · Reports.UpdateContent
|
||||
☑ API contract — OpenAPI 已批契约扩展
|
||||
☑ Migration exists — 000023 home_daily_tips(本地表已存在)
|
||||
☑ Observability — tips db 错误 log;refresh 失败软回退旧报告
|
||||
☑ Error handling defined
|
||||
☑ Tests included — shichen · temporal as_of/valid_until
|
||||
☑ Rollback considered — BD 已写
|
||||
☑ No architecture regression
|
||||
☑ Matches Change Boundary — 未见头像/scalebank/textsafe 并入本 ECR 交付叙述
|
||||
☑ Trace — BD-2026-014 · TEST_REPORT/ECR-014.md · 本 Review
|
||||
```
|
||||
|
||||
## Residual(接受,不阻断)
|
||||
|
||||
- `refreshTemporalIfNeeded` 在 UpdateContent 失败时静默返回旧报告(可用性优先;可后续加指标)
|
||||
- 同日仅缺 `valid_until` 时 `stampValidUntil` 改内存、未必立刻落库(下次 GET 仍可装饰)
|
||||
- 无独立 HTTP integration 冒烟(单元 + 契约足够本 L2 Risk=Low)
|
||||
|
||||
## Out of scope(正确排除)
|
||||
|
||||
头像 → ECR-015 · scalebank → ECR-013 · textsafe → ECR-012
|
||||
|
||||
## Decision
|
||||
|
||||
**Approve** → ECR-014 可 **Closed** / 合入(勿带密钥、`test-results/`、未纳入 Scope 的刮题库原始大文件)
|
||||
@@ -0,0 +1,47 @@
|
||||
# CODE_REVIEW — ECR-015 Account avatar
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**Reviewer:** Agent (ESS REVIEWER)
|
||||
**Verdict:** **Approve**
|
||||
**Retrospective:** true
|
||||
|
||||
```text
|
||||
ESS Mode: L2
|
||||
Phase: REVIEWER
|
||||
ECR: ECR-015
|
||||
Forbidden: production edits this turn
|
||||
```
|
||||
|
||||
## Process debt
|
||||
|
||||
实现早于 ECR(倒序)。**非**正序样板路径。
|
||||
|
||||
## Acceptance ↔ Evidence
|
||||
|
||||
| Item | OK |
|
||||
|------|-----|
|
||||
| Upload ≤2MB jpeg/png/webp | Store + handler 40114 |
|
||||
| 超限/坏类型 | store_test PASS |
|
||||
| media 公开读 · 拒穿越 | ResolveAbs + MediaHandler |
|
||||
| me.avatar_url · H5 默认图 | types/SDK/MinePage/default-avatar.png |
|
||||
| OpenAPI | upload/media 已述 |
|
||||
| go test avatar · ess-validate coding | PASS |
|
||||
|
||||
## Backend Review
|
||||
|
||||
```text
|
||||
☑ Design Compliance — BD-2026-015
|
||||
☑ Layer boundary · Repository · Migration 000018
|
||||
☑ API contract · Security (size/type/path)
|
||||
☑ Tests · Rollback · Change Boundary(未吞 OpenLogin/题库)
|
||||
☑ Trace — TEST_REPORT · 本 Review
|
||||
```
|
||||
|
||||
## Residual(接受)
|
||||
|
||||
- 手工 UI 冒烟未在本机浏览器执行(单测覆盖核心安全边界)
|
||||
- 无对象存储(Spec Out)
|
||||
|
||||
## Decision
|
||||
|
||||
**Approve** → ECR-015 **Closed**
|
||||
@@ -0,0 +1,12 @@
|
||||
# CODE_REVIEW — ECR-016 MBTI OEJTS
|
||||
|
||||
**Verdict:** **Approve**
|
||||
**Retrospective:** true · Process debt:倒序实现
|
||||
|
||||
## Backend Review
|
||||
|
||||
☑ BD-2026-016 · jungian 计分 · mbti-full 会员锁 · migrations 019–022 · tests PASS · OpenAPI
|
||||
|
||||
## Decision
|
||||
|
||||
**Approve** → Closed
|
||||
@@ -0,0 +1,36 @@
|
||||
# CODE_REVIEW — WIP sweep 2026-08-13
|
||||
|
||||
**Scope:** ECR-012~016 相关实现 + 本地脏树抽检
|
||||
**Verdict:** **PASS(测试)** · 无阻断级 must-fix;有 residual
|
||||
|
||||
## Tests
|
||||
|
||||
| Suite | Result |
|
||||
|-------|--------|
|
||||
| `go test` API unit(除 integration) | **PASS** |
|
||||
| `go test ./internal/integration/` | **PASS** |
|
||||
| `npm run test:h5` | **PASS** 16 files / 41 tests |
|
||||
| `vue-tsc --noEmit` | **PASS**(typecheck + MinePage 拆分已清) |
|
||||
|
||||
## Hotspots
|
||||
|
||||
| Area | Assessment |
|
||||
|------|------------|
|
||||
| avatar Store/ResolveAbs | 大小/类型/UUID 文件名/拒 `..`;单测覆盖 |
|
||||
| temporal refresh | GET 换日原地 UpdateContent;失败软回退 |
|
||||
| daily-tips | 时辰缓存 + 异步 LLM;不阻塞 |
|
||||
| scalebank + R8 H5 | slug 响应式;有结果直接展示 |
|
||||
| textsafe | Check → 40060 路径存在 |
|
||||
| mbti-full lock | service Locked / 40310 |
|
||||
|
||||
## Residual(不阻断合入判定,建议后续 ECR/L1)
|
||||
|
||||
1. ~~H5 typecheck~~ **已清**:`@types/node` + TabBar/MatchCompare/ReportRich
|
||||
2. ~~MinePage.vue 超 400 行~~ **已拆**:`useMinePage` + `mine/*` + `mineCatalog`
|
||||
3. **avatar** 信任 Content-Type/扩展名,未做 magic-byte 校验(常见可接受 Residual)
|
||||
4. **temporal** UpdateContent 失败静默返回旧报告(无 metrics)
|
||||
5. Vitest 中 `router-link` stub 警告(测试噪音)
|
||||
|
||||
## Decision
|
||||
|
||||
功能回归测试 **绿**;typecheck / MinePage 行数债已清。剩余 avatar magic-byte、temporal 软失败为可选 Residual。
|
||||
@@ -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
|
||||
@@ -0,0 +1,41 @@
|
||||
# ECR-013
|
||||
|
||||
**Title:** 探索 curated 题库(A 集)+ 结果回看
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-13
|
||||
**Approved:** 2026-08-13(Human:探索题库非临床 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
|
||||
@@ -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` R5–R8 · `star-profile.md` R12–R14 · `life-rhythm.md` R8–R11
|
||||
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 PASS;CODE_REVIEW 记录 Retro
|
||||
|
||||
## Trace
|
||||
|
||||
Spec home / star-profile / life-rhythm · TASK-014 · BD-2026-014 · TEST_REPORT/ECR-014.md
|
||||
@@ -0,0 +1,57 @@
|
||||
# ECR-015
|
||||
|
||||
**Title:** 账号头像上传与媒体读取
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-13
|
||||
**Approved:** 2026-08-13(Human:开 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 R9;TEST / 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 PASS;ess-validate coding PASS
|
||||
- [x] CODE_REVIEW 记 Retro(Reviewer)
|
||||
|
||||
## Trace
|
||||
|
||||
Spec `account-auth` · TASK-015 · BD-2026-015 · TEST_REPORT/ECR-015.md
|
||||
@@ -0,0 +1,49 @@
|
||||
# ECR-016
|
||||
|
||||
**Title:** MBTI 标准/完整版(OEJTS)题库与计分
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-13
|
||||
**Approved:** 2026-08-13(Human:授权自主 Loop 收口剩余 WIP)
|
||||
**Change Level:** L2
|
||||
**Retrospective:** true
|
||||
|
||||
## Retro
|
||||
|
||||
| Field | Content |
|
||||
|-------|---------|
|
||||
| Original drift | migrations 000019–022 · jungian/mbti_result · Spec R10–R11 已先于本 ECR |
|
||||
| Scope freeze | 仅 `mbti-lite`/`mbti-full` 题库、计分、会员锁;禁止 scalebank A 集、头像、时效、OpenLogin |
|
||||
| Process debt | 倒序;CODE_REVIEW 须点名 |
|
||||
|
||||
## Change
|
||||
|
||||
1. Spec `explore-test` R9–R12:`mbti-lite` 32 题免费 · `mbti-full` 60 题会员
|
||||
2. migrations 019–022 · 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 coding;CODE_REVIEW Retro
|
||||
|
||||
## Trace
|
||||
|
||||
Spec explore-test · TASK-016 · BD-2026-016 · TEST_REPORT/ECR-016.md
|
||||
@@ -0,0 +1,20 @@
|
||||
# ENGINEERING_SPEC — ECR-013 Scale bank explore
|
||||
|
||||
**ECR:** ECR-013
|
||||
**BD:** BD-2026-013
|
||||
|
||||
## Layers
|
||||
|
||||
Handler → Service →(scalebank embed \| ScaleRepo)
|
||||
|
||||
## Constraints
|
||||
|
||||
- Function ≤50 · File ≤400(页面/composable 已接近上限,禁止再堆逻辑)
|
||||
- 题目仅 embed;DB 仅 stub scale + results
|
||||
- Lexicon:非诊断 disclaimer
|
||||
|
||||
## Frontend
|
||||
|
||||
- `ExplorePage` / `ExploreBankCategoryPage` 共用图标 allowlist helper
|
||||
- `useScalePage`:slug 响应式;有结果直接 `phase=result`
|
||||
- `AppHeader`:`/explore` 显示 BackButton
|
||||
@@ -0,0 +1,14 @@
|
||||
# ENGINEERING_SPEC — ECR-014 Temporal refresh
|
||||
|
||||
**ECR:** ECR-014
|
||||
**BD:** BD-2026-014
|
||||
|
||||
## Layers
|
||||
|
||||
Handler → Service(home|report) → Repository → DB
|
||||
|
||||
## Constraints
|
||||
|
||||
- 换日**禁止**新报告 id(深度权益)
|
||||
- 时辰贴士禁止同步阻塞 LLM
|
||||
- Retro:仅收口 Scope freeze 内已实现契约,不扩功能
|
||||
@@ -0,0 +1,14 @@
|
||||
# ENGINEERING_SPEC — ECR-015 Account avatar
|
||||
|
||||
**ECR:** ECR-015
|
||||
**BD:** BD-2026-015
|
||||
|
||||
## Layers
|
||||
|
||||
Handler(auth|media) → Service(auth) → avatar store + AuthRepo → DB/FS
|
||||
|
||||
## Constraints
|
||||
|
||||
- 本地目录相对进程 CWD:`data/avatars/`(gitignore)
|
||||
- `avatar_url` 存 API 相对路径,H5 经 `apiAssetURL` 拼 base
|
||||
- Retro:收口 Scope freeze,不扩存储后端
|
||||
@@ -0,0 +1,3 @@
|
||||
# ENGINEERING_SPEC — ECR-016
|
||||
|
||||
Handler → scale.Service → Repo + jungian score;mbti-full MembershipChecker.
|
||||
@@ -0,0 +1,34 @@
|
||||
# HANDOFF — ECR-012 Architect → Engineer
|
||||
|
||||
**Date:** 2026-08-12
|
||||
**ECR:** ECR-012(**Approved**)
|
||||
**BD:** BD-2026-012 Approved
|
||||
|
||||
## Task interpretation
|
||||
|
||||
用户自由文字统一合规闸门:后端 `textsafe` 权威;H5 `@yuxingu/utils` 镜像即时提示;错误码 **40060**。
|
||||
|
||||
## Load
|
||||
|
||||
1. `docs/ECR/ECR-012-input-compliance.md`
|
||||
2. `docs/BACKEND_DESIGN/BD-2026-012-input-compliance.md`
|
||||
3. Spec:`.ai/product/feature-spec/input-compliance.md`
|
||||
4. `docs/PROJECT_RULES.md` · `.ai/definition-of-done.md`
|
||||
|
||||
## Ordered plan
|
||||
|
||||
1. 实现 `internal/textsafe` + 单测
|
||||
2. 挂接 auth / profile / ask / companion / growth / synastry(及 mood note 若在 Spec)
|
||||
3. Handler:`ErrRejected` → 40060
|
||||
4. utils + 关键表单即时错误
|
||||
5. OpenAPI 注明 40060 · TEST_REPORT · HANDOFF→reviewer
|
||||
|
||||
## Smoke checklist
|
||||
|
||||
- [ ] 违规昵称 / ask / note → 40060
|
||||
- [ ] 合法中文名通过
|
||||
- [ ] 前端至少昵称/问答/档案名有即时错误
|
||||
|
||||
## Owner
|
||||
|
||||
`STATE.owner = engineer`
|
||||
@@ -0,0 +1,26 @@
|
||||
# HANDOFF — ECR-012 Engineer → Reviewer
|
||||
|
||||
**From:** Engineer
|
||||
**To:** Reviewer
|
||||
**Date:** 2026-08-13
|
||||
**ECR:** ECR-012
|
||||
|
||||
## Delivered
|
||||
|
||||
- Spec `input-compliance.md` Active
|
||||
- `apps/api/internal/textsafe/` + unit tests
|
||||
- Wired services/handlers → **40060**
|
||||
- `@yuxingu/utils` `validateUserText` + 关键 H5 表单
|
||||
- `docs/TEST_REPORT/ECR-012.md` PASS
|
||||
- `docs/BACKEND_DESIGN/BD-2026-012-input-compliance.md`
|
||||
|
||||
## Verify
|
||||
|
||||
```bash
|
||||
cd apps/api && go test ./internal/textsafe/ -count=1
|
||||
# 可选:对本机 API 复跑 TEST_REPORT 用例表
|
||||
```
|
||||
|
||||
## Owner next
|
||||
|
||||
`STATE.owner = reviewer`
|
||||
@@ -0,0 +1,28 @@
|
||||
# HANDOFF — ECR-013 Architect → Engineer
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**ECR:** ECR-013(**Approved**)
|
||||
**BD:** BD-2026-013 Approved
|
||||
|
||||
## Task interpretation
|
||||
|
||||
落地探索 curated 题库 A 集:目录 API · 作答/结果回看 · H5 宫格/分类 · OpenAPI · 图标去重 · 探索返回。
|
||||
|
||||
## Load
|
||||
|
||||
1. `docs/ECR/ECR-013-scale-bank-explore.md`
|
||||
2. `docs/BACKEND_DESIGN/BD-2026-013-scale-bank-explore.md`
|
||||
3. Spec `explore-test.md`
|
||||
4. `.ai/definition-of-done.md`
|
||||
|
||||
## Ordered plan
|
||||
|
||||
1. 核对 scalebank embed 与 R13 范围(无临床)
|
||||
2. OpenAPI 补 `/scale-bank/*`
|
||||
3. 抽取 H5 图标 allowlist;确认 R8/R14
|
||||
4. 单测 + integration + vitest
|
||||
5. TEST_REPORT · HANDOFF→reviewer · STATE
|
||||
|
||||
## Owner
|
||||
|
||||
`STATE.owner = engineer`
|
||||
@@ -0,0 +1,27 @@
|
||||
# HANDOFF — ECR-013 Engineer → Reviewer
|
||||
|
||||
**From:** Engineer
|
||||
**To:** Reviewer
|
||||
**Date:** 2026-08-13
|
||||
**ECR:** ECR-013
|
||||
|
||||
## Delivered
|
||||
|
||||
- scalebank curated A 集 · catalog/category API · bank Get/Submit/Latest
|
||||
- H5 Explore 精选/分类 · R8/R14 · 独立图标 · 探索返回
|
||||
- 重构:`lib/homeToolIconName.ts`(类型 + resolve)
|
||||
- OpenAPI `/scale-bank/*`
|
||||
- TEST_REPORT/ECR-013.md
|
||||
|
||||
## Verify
|
||||
|
||||
```bash
|
||||
export ESS_ROOT=/Users/jack/Project/skills/engineering-spec-system
|
||||
cd apps/api && go test ./internal/scalebank/ ./internal/integration/ -run 'TestCatalogCuratedASet|TestScaleBankResultRoundtrip' -count=1
|
||||
cd ../user-h5 && npx vitest run src/pages/ScalePage.spec.ts
|
||||
cd ../.. && python scripts/ess-validate.py --phase coding --ecr ECR-013
|
||||
```
|
||||
|
||||
## Owner next
|
||||
|
||||
`STATE.owner = reviewer`
|
||||
@@ -0,0 +1,21 @@
|
||||
# HANDOFF — ECR-013 Implementation Report
|
||||
|
||||
**ECR:** ECR-013
|
||||
**Date:** 2026-08-13
|
||||
|
||||
## Summary
|
||||
|
||||
落地探索 curated 题库(非临床 A 集):embed 目录、作答落库、二次进入只看结果/重测、探索 UI 与返回、OpenAPI。
|
||||
|
||||
## Key paths
|
||||
|
||||
| Area | Path |
|
||||
|------|------|
|
||||
| Bank | `apps/api/internal/scalebank/` |
|
||||
| Service | `apps/api/internal/service/scale/service.go` |
|
||||
| H5 | `ExplorePage.vue` · `ExploreBankCategoryPage.vue` · `useScalePage.ts` |
|
||||
| Icons | `lib/homeToolIconName.ts` · `HomeToolIcon.vue` |
|
||||
|
||||
## Deviations
|
||||
|
||||
无(相对 BD-2026-013)
|
||||
@@ -0,0 +1,27 @@
|
||||
# HANDOFF — ECR-014 Architect → Engineer
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**ECR:** ECR-014(**Approved** · **Retrospective: true**)
|
||||
**BD:** BD-2026-014 Approved
|
||||
|
||||
## Task interpretation
|
||||
|
||||
将后台时效字段与前端 `scheduleRefresh` / `useHomeDailyTips` / star·rhythm 静默刷新对齐;补 OpenAPI;跑测。
|
||||
**禁止**顺手头像 / 题库。
|
||||
|
||||
## Load
|
||||
|
||||
1. `docs/ECR/ECR-014-temporal-refresh.md`
|
||||
2. `docs/BACKEND_DESIGN/BD-2026-014-temporal-refresh.md`
|
||||
3. Spec:`home` · `star-profile` · `life-rhythm`
|
||||
|
||||
## Ordered plan
|
||||
|
||||
1. 确认 migration `000023` 可应用;Tips repo 已注入 router
|
||||
2. OpenAPI:HomeDailyTips / report summary `as_of`+`valid_until` 契约写清
|
||||
3. `go test` home + report temporal
|
||||
4. TEST_REPORT · HANDOFF→reviewer · 更新 STATE/TRACE/CHANGELOG
|
||||
|
||||
## Owner
|
||||
|
||||
`STATE.owner = engineer`
|
||||
@@ -0,0 +1,29 @@
|
||||
# HANDOFF — ECR-014 Engineer → Reviewer
|
||||
|
||||
**From:** Engineer
|
||||
**To:** Reviewer
|
||||
**Date:** 2026-08-13
|
||||
**ECR:** ECR-014
|
||||
**Retrospective:** true
|
||||
|
||||
## Delivered
|
||||
|
||||
- Architect 包已存在;本阶段补齐 OpenAPI 契约(HomeDailyTips envelope · GrowthReport summary 时效说明)
|
||||
- 确认 migration `000023` / Tips 注入 / temporal refresh 已接线
|
||||
- `go test` home + report PASS · TEST_REPORT
|
||||
|
||||
## Out of this ECR
|
||||
|
||||
头像(Spec account-auth R9 已有,须另开 ECR-015)· scalebank(ECR-013)· textsafe(ECR-012)
|
||||
|
||||
## Verify
|
||||
|
||||
```bash
|
||||
export ESS_ROOT=/Users/jack/Project/skills/engineering-spec-system
|
||||
cd apps/api && go test ./internal/service/home/ ./internal/service/report/ -count=1
|
||||
cd ../.. && python scripts/ess-validate.py --phase coding --ecr ECR-014
|
||||
```
|
||||
|
||||
## Owner next
|
||||
|
||||
`STATE.owner = reviewer`
|
||||
@@ -0,0 +1,35 @@
|
||||
# HANDOFF — ECR-015 Architect → Engineer
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**ECR:** ECR-015(**Approved** · **Retrospective: true**)
|
||||
**BD:** BD-2026-015 Approved
|
||||
|
||||
## Task interpretation
|
||||
|
||||
收口头像:确认 migration/接线/OpenAPI/H5/SDK 与 Spec R9 一致;补缺测与 TEST_REPORT;不扩 Scope。
|
||||
|
||||
## Load
|
||||
|
||||
1. `docs/ECR/ECR-015-account-avatar.md`
|
||||
2. `docs/BACKEND_DESIGN/BD-2026-015-account-avatar.md`
|
||||
3. Spec `account-auth.md` R9
|
||||
4. `.ai/definition-of-done.md`
|
||||
|
||||
## Ordered plan
|
||||
|
||||
1. 确认 `000018` 已应用;`users.avatar_url` 可读
|
||||
2. 核对 UploadAvatar · MediaHandler · avatar.Store/ResolveAbs
|
||||
3. 补 `internal/avatar` 单测(大小/类型/路径穿越)若缺
|
||||
4. OpenAPI / SDK / MinePage 默认图路径核对
|
||||
5. TEST_REPORT · HANDOFF→reviewer · STATE
|
||||
|
||||
## Smoke checklist
|
||||
|
||||
- [ ] 登录后「我的」上传 JPG <2MB → 头像更新
|
||||
- [ ] WebP/PNG OK;>2MB 或 exe 失败文案可读
|
||||
- [ ] 未设置头像显示 default-avatar
|
||||
- [ ] 新标签打开 `/api/v1/media/avatars/...` 可见图
|
||||
|
||||
## Owner
|
||||
|
||||
`STATE.owner = engineer`
|
||||
@@ -0,0 +1,26 @@
|
||||
# HANDOFF — ECR-015 Engineer → Reviewer
|
||||
|
||||
**From:** Engineer
|
||||
**To:** Reviewer
|
||||
**Date:** 2026-08-13
|
||||
**ECR:** ECR-015
|
||||
**Retrospective:** true
|
||||
|
||||
## Delivered
|
||||
|
||||
- 核对 Spec R9 接线(migration / auth / media / H5 / SDK)
|
||||
- 新增 `internal/avatar/store_test.go`(穿越 · 类型 · 大小 · 覆盖写)
|
||||
- OpenAPI 补错误码与路径约束说明
|
||||
- TEST_REPORT
|
||||
|
||||
## Verify
|
||||
|
||||
```bash
|
||||
export ESS_ROOT=/Users/jack/Project/skills/engineering-spec-system
|
||||
cd apps/api && go test ./internal/avatar/ -count=1
|
||||
cd ../.. && python scripts/ess-validate.py --phase coding --ecr ECR-015
|
||||
```
|
||||
|
||||
## Owner next
|
||||
|
||||
`STATE.owner = reviewer`
|
||||
@@ -0,0 +1,5 @@
|
||||
# HANDOFF — ECR-016 Architect → Engineer
|
||||
|
||||
**ECR:** ECR-016 Approved · RETRO
|
||||
核对 migrations 已应用 · go test scale · OpenAPI 会员锁说明若缺则补 · TEST_REPORT → reviewer。
|
||||
`STATE.owner=engineer`
|
||||
@@ -0,0 +1,3 @@
|
||||
# HANDOFF — ECR-016 Engineer → Reviewer
|
||||
|
||||
核对 DB 题量 · scale 单测 PASS · OpenAPI 会员锁。请 CODE_REVIEW 记 Retro。
|
||||
@@ -0,0 +1,15 @@
|
||||
# PRODUCT_SPEC — ECR-012
|
||||
|
||||
**ECR:** ECR-012
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-12
|
||||
|
||||
产品权威仍以 `.ai/product/feature-spec/input-compliance.md` 为准(双轨)。本文件仅做 ESS 索引。
|
||||
|
||||
| Workstream | Spec | 用户可见结果 |
|
||||
|------------|------|----------------|
|
||||
| 文字合规 | `input-compliance.md` | 昵称/档案名/问答/笔记等违规即时提示;后端 40060 |
|
||||
|
||||
## Out of product scope
|
||||
|
||||
第三方审核 SaaS · 语音 · Ops 全文案重构
|
||||
@@ -0,0 +1,18 @@
|
||||
# PRODUCT_SPEC — ECR-013
|
||||
|
||||
**ECR:** ECR-013
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-13
|
||||
|
||||
产品权威:`.ai/product/feature-spec/explore-test.md`(R8 · R13 · R14)。
|
||||
|
||||
| 用户可见 | 说明 |
|
||||
|----------|------|
|
||||
| 探索·题库精选 | 每类 1~2 套宫格,图标各异 |
|
||||
| 探索·题库分类 | 人格 / 情绪能力 / 智能 / 生活与关系 |
|
||||
| 作答与回看 | 完成后再次进入只看结果或重测 |
|
||||
| 探索返回 | 顶栏返回(可回首页) |
|
||||
|
||||
## Out
|
||||
|
||||
临床筛查 · 诊断话术 · 竞品品牌词
|
||||
@@ -0,0 +1,18 @@
|
||||
# PRODUCT_SPEC — ECR-014
|
||||
|
||||
**ECR:** ECR-014
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-13
|
||||
**Retrospective:** true
|
||||
|
||||
权威 Spec:
|
||||
|
||||
| Spec | 用户可见 |
|
||||
|------|----------|
|
||||
| `home.md` R5–R8 | 自己卡贴士按十二时辰切换;`valid_until` 到点刷新 |
|
||||
| `star-profile.md` R12–R14 | 运势按自然日刷新;报告 id 不变 |
|
||||
| `life-rhythm.md` R8–R11 | 今日/本周建议按日刷新;五行 bars |
|
||||
|
||||
## Out
|
||||
|
||||
头像 · 题库 · 诊断话术
|
||||
@@ -0,0 +1,27 @@
|
||||
# PRODUCT_SPEC — ECR-015
|
||||
|
||||
**ECR:** ECR-015
|
||||
**Status:** Approved
|
||||
**Date:** 2026-08-13
|
||||
**Retrospective:** true
|
||||
|
||||
权威:`.ai/product/feature-spec/account-auth.md` R9。
|
||||
|
||||
| 用户可见 | 说明 |
|
||||
|----------|------|
|
||||
| 我的 · 点头像 | 相册或拍照上传 |
|
||||
| 各页账号展示 | `avatar_url`;无则默认愈心小人正面 |
|
||||
|
||||
## 埋点(权威在 Feature Spec §11)
|
||||
|
||||
| Event | 触发 |
|
||||
|-------|------|
|
||||
| `avatar_sheet_opened` | 打开更换头像 sheet |
|
||||
| `avatar_upload_succeeded` | 上传成功 |
|
||||
| `avatar_upload_failed` | 上传失败(`reason` 枚举,无 PII) |
|
||||
|
||||
挂接实现另迭代;不改 ECR-007 采集 Schema。
|
||||
|
||||
## Out
|
||||
|
||||
第三方图床 · 头像社交广场 · 改开放登录 R1 · 强制改 Ops 漏斗核心 5 事件
|
||||
@@ -0,0 +1,5 @@
|
||||
# PRODUCT_SPEC — ECR-016
|
||||
|
||||
**ECR:** ECR-016 · **Retrospective:** true
|
||||
|
||||
权威:`explore-test.md` R9–R12。标准版免费 32 题;完整版 60 题成长会员。
|
||||
+15
-7
@@ -49,13 +49,21 @@
|
||||
|
||||
## Active anchors
|
||||
|
||||
- ECR: ECR-006 Closed;ECR-007/008/009 Implemented;**ECR-010 Implemented(待 Reviewer Closed)**;**ECR-011 Closed**;ECR-001–005 Closed
|
||||
- EXP: (无)
|
||||
- STATE: `docs/STATE/ECR-011.md` · `docs/STATE/ECR-010.md`(及 006–009)
|
||||
- TRACEABILITY: `docs/TRACEABILITY.md`
|
||||
- ADR: `.ai/adr/0007-ess-ai-dual-track.md`
|
||||
- Product status: `.ai/product/p1-status.md`(**P1 Complete**)· `.ai/product/p2-status.md`(**P2 Complete**)
|
||||
- Active Spec: `ops-system` ·(ECR-011 已 Closed)`profile` · `star-profile` · `account-auth` · `home`
|
||||
- **ESS Intake G0:** **FROZEN** · Validation **Active**(`$ESS_ROOT/ESS_INTAKE_0.2_FREEZE.md`)— 下一条真实 L2 跑 A→B→C;失败只修 G0
|
||||
- **本仓:** `ess_intake: strict` · Retro FAIL · 单 ECR Context
|
||||
- **禁止验证期扩:** PR2/PR3 · Loop v1.2 · 自动建 ECR / 自动切 Context
|
||||
- **Loop / Adapter:** FROZEN / STABLE;不在本仓维护
|
||||
- ECR: ECR-006–016 Closed(012–016 含 RETRO 收口);ECR-001–005 Closed
|
||||
- EXP: (无)
|
||||
- STATE: `docs/STATE/ECR-016.md` · `docs/STATE/ECR-015.md` · `docs/STATE/ECR-014.md`
|
||||
- TRACEABILITY: `docs/TRACEABILITY.md`
|
||||
- ADR: `.ai/adr/0007-ess-ai-dual-track.md`
|
||||
- Product status: `.ai/product/p1-status.md`(**P1 Complete**)· `.ai/product/p2-status.md`(**P2 Complete**)
|
||||
- Active Spec: `account-auth` · `explore-test` · `home` · `star-profile` · `life-rhythm` · `input-compliance` · `ops-system` · `profile`
|
||||
|
||||
## WIP(尚未单独 ECR)
|
||||
|
||||
(无显著未挂 ECR 的后端 WIP;工作区其它 FE chrome 属既有 Closed ECR 或 L0 UI)
|
||||
|
||||
## Pointers
|
||||
|
||||
|
||||
+19
-3
@@ -3,6 +3,18 @@
|
||||
Inherits: `$ESS_ROOT/product-governance/PROJECT_RULES.md`(流程)
|
||||
Product/DoD 权威:`.ai/`(不在此复制长文)
|
||||
|
||||
## ESS Intake(本仓覆盖)
|
||||
|
||||
```yaml
|
||||
ess_intake: strict
|
||||
```
|
||||
|
||||
- **权威入口:** `$ESS_ROOT/governance/SESSION_BOOTSTRAP.md`(G0 Mode 块)
|
||||
- **Solo multi-role:** `$ESS_ROOT/governance/AGENT_OPERATIONS.md`
|
||||
- **Execution Context:** 同时只绑定 **一个** Active ECR(或一个 L1 TASK);新主题 = OUT OF SCOPE,禁止顺手改码
|
||||
- **retro-ecr:** 本仓 **FAIL**(须 `Retrospective: true` + Original drift + Scope freeze + Process debt;不得伪装正序路径)。通用 ESS 默认为 WARN;脚本强制见后续门禁 PR,**规则即时约束 Agent**
|
||||
- **Loop / Adapter:** 不在本仓维护;已授权执行不扩展 ESS Intake 职责
|
||||
|
||||
## Domain invariants
|
||||
|
||||
1. 语言契约:只用 `.ai/product/lexicon.md` 中的愈心谷用词;禁止竞品品牌词与恐吓/吉凶话术。
|
||||
@@ -19,6 +31,7 @@ Product/DoD 权威:`.ai/`(不在此复制长文)
|
||||
| L0 | 文档/注释/无行为;可无 ECR |
|
||||
| L1 | 明确 bugfix;可无新 Feature Spec,但不得扩行为 |
|
||||
| L2 | 功能行为变更 → Feature Spec Active + ECR Approved + HANDOFF |
|
||||
| L2-BLOCKED | 无 Approved ECR 时禁止改 `apps/` / `packages/` / `proto/` / `migrations/` |
|
||||
| L3 | 栈/包边界/架构 → ADR(`.ai/adr/`)+ ECR + ENGINEERING_SPEC |
|
||||
|
||||
## Forbidden(extra)
|
||||
@@ -27,9 +40,12 @@ Product/DoD 权威:`.ai/`(不在此复制长文)
|
||||
- Architect 角色改 `apps/` / `packages/` 生产实现
|
||||
- 无 Human 批准把实验当 Live 行为推广
|
||||
- 提交 `config.local.yaml`、`.env`、密钥
|
||||
- 同一 review turn Approve + Modify
|
||||
- 在已绑定 ECR 的 Execution Context 内「顺便」做第二功能
|
||||
|
||||
## Completion
|
||||
|
||||
1. ESS gate(有 ECR 时):`python scripts/ess-validate.py --phase <phase> --ecr ECR-xxx`
|
||||
2. 本仓 DoD:`.ai/definition-of-done.md` + `.ai/review.md`
|
||||
3. 有行为变更时更新/尊重 `.ai/product/p1-status.md` 标签
|
||||
1. 开场 ESS Mode 块(G0)通过且 `Action: CONTINUE`(或明确 L0)
|
||||
2. ESS gate(有 ECR 时):`python scripts/ess-validate.py --phase <phase> --ecr ECR-xxx`
|
||||
3. 本仓 DoD:`.ai/definition-of-done.md` + `.ai/review.md`
|
||||
4. 有行为变更时更新/尊重 `.ai/product/p1-status.md` 标签
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
# STATE · ECR-012
|
||||
|
||||
**Status:** Closed
|
||||
**Updated:** 2026-08-13
|
||||
|
||||
## Done
|
||||
|
||||
- Spec / BD / PRODUCT_SPEC / HANDOFF architect→engineer · engineer→reviewer
|
||||
- `textsafe` + H5 镜像 · 40060 · TEST_REPORT PASS
|
||||
- CODE_REVIEW **Approve**
|
||||
|
||||
## Owner
|
||||
|
||||
release / merge(Human)
|
||||
@@ -0,0 +1,11 @@
|
||||
# STATE · ECR-013
|
||||
|
||||
**Status:** Closed
|
||||
**Updated:** 2026-08-13
|
||||
**Owner:** release
|
||||
|
||||
## Done
|
||||
|
||||
- Spec explore-test R8/R13/R14 · BD-2026-013 · PRODUCT/ENGINEERING · HANDOFF
|
||||
- scalebank + API + H5 · OpenAPI · icon lib 重构
|
||||
- TEST_REPORT PASS · CODE_REVIEW **Approve**
|
||||
@@ -0,0 +1,12 @@
|
||||
# STATE · ECR-014
|
||||
|
||||
**Status:** Closed
|
||||
**Updated:** 2026-08-13
|
||||
**Owner:** release
|
||||
**Retrospective:** true
|
||||
|
||||
## Done
|
||||
|
||||
- CODE_REVIEW **Approve**(含 Process debt)
|
||||
- TEST_REPORT PASS · OpenAPI 契约 · home/report 单测
|
||||
- Scope freeze 未吞并头像/题库/textsafe
|
||||
@@ -0,0 +1,10 @@
|
||||
# STATE · ECR-015
|
||||
|
||||
**Status:** Closed
|
||||
**Updated:** 2026-08-13
|
||||
**Owner:** release
|
||||
**Retrospective:** true
|
||||
|
||||
## Done
|
||||
|
||||
CODE_REVIEW **Approve** · avatar 单测 · OpenAPI · Process debt 已记
|
||||
@@ -0,0 +1,5 @@
|
||||
# STATE · ECR-016
|
||||
|
||||
**Status:** Closed
|
||||
**Owner:** release
|
||||
**Retrospective:** true
|
||||
@@ -0,0 +1,16 @@
|
||||
ecr: ECR-012
|
||||
title: user text input compliance
|
||||
status: closed
|
||||
owner: release
|
||||
role: reviewer
|
||||
change_level: L2
|
||||
artifacts:
|
||||
- docs/ECR/ECR-012-input-compliance.md
|
||||
- docs/BACKEND_DESIGN/BD-2026-012-input-compliance.md
|
||||
- docs/TEST_REPORT/ECR-012.md
|
||||
- docs/CODE_REVIEW/ECR-012.md
|
||||
- docs/STATE/ECR-012.md
|
||||
- .ai/product/feature-spec/input-compliance.md
|
||||
- apps/api/internal/textsafe/
|
||||
- packages/utils/src/textsafe.ts
|
||||
notes: Closed 2026-08-13; CODE_REVIEW Approve
|
||||
@@ -0,0 +1,16 @@
|
||||
ecr: ECR-013
|
||||
title: curated scale bank explore
|
||||
status: closed
|
||||
owner: release
|
||||
role: reviewer
|
||||
change_level: L2
|
||||
forbidden:
|
||||
- redesign_scope
|
||||
- clinical_scales
|
||||
artifacts:
|
||||
- docs/ECR/ECR-013-scale-bank-explore.md
|
||||
- docs/BACKEND_DESIGN/BD-2026-013-scale-bank-explore.md
|
||||
- docs/TEST_REPORT/ECR-013.md
|
||||
- docs/CODE_REVIEW/ECR-013.md
|
||||
- docs/STATE/ECR-013.md
|
||||
notes: Closed 2026-08-13 after CODE_REVIEW Approve
|
||||
@@ -0,0 +1,18 @@
|
||||
ecr: ECR-014
|
||||
title: temporal refresh FE/BE align
|
||||
status: closed
|
||||
owner: release
|
||||
role: reviewer
|
||||
change_level: L2
|
||||
forbidden:
|
||||
- redesign_scope
|
||||
- avatar
|
||||
- scalebank
|
||||
- textsafe
|
||||
artifacts:
|
||||
- docs/ECR/ECR-014-temporal-refresh.md
|
||||
- docs/BACKEND_DESIGN/BD-2026-014-temporal-refresh.md
|
||||
- docs/TEST_REPORT/ECR-014.md
|
||||
- docs/CODE_REVIEW/ECR-014.md
|
||||
- docs/STATE/ECR-014.md
|
||||
notes: Closed 2026-08-13; Retrospective true; CODE_REVIEW Approve
|
||||
@@ -0,0 +1,11 @@
|
||||
ecr: ECR-015
|
||||
title: account avatar upload
|
||||
status: closed
|
||||
owner: release
|
||||
role: reviewer
|
||||
change_level: L2
|
||||
artifacts:
|
||||
- docs/CODE_REVIEW/ECR-015.md
|
||||
- docs/TEST_REPORT/ECR-015.md
|
||||
- docs/STATE/ECR-015.md
|
||||
notes: Closed 2026-08-13; Retrospective true; CODE_REVIEW Approve
|
||||
@@ -0,0 +1,10 @@
|
||||
ecr: ECR-016
|
||||
title: MBTI OEJTS lite full
|
||||
status: closed
|
||||
owner: release
|
||||
role: reviewer
|
||||
change_level: L2
|
||||
notes: Closed autonomous loop; Retrospective true
|
||||
artifacts:
|
||||
- docs/CODE_REVIEW/ECR-016.md
|
||||
- docs/TEST_REPORT/ECR-016.md
|
||||
+2
-1
@@ -13,7 +13,8 @@ Global matrix(可选):`$ESS_ROOT/technology-governance/DECISION_MATRIX.md`
|
||||
| DB | PostgreSQL |
|
||||
| Migrations | `apps/api/migrations/`(启动自动应用) |
|
||||
| Log | structured(zap / slog);业务路径禁止 `fmt.Println` |
|
||||
| Module | `github.com/yuxingu/digital-psychology/apps/api` |
|
||||
| Module | `github.com/yuxingu/digital-psychology/apps/api`(Go import;非 GitHub 托管) |
|
||||
| Git | `https://git.jackyu66.com/jack/digital-psychology.git` |
|
||||
| Frontend | Vue 3 + TypeScript `strict` + Vite + vue-router + Pinia |
|
||||
| Shared TS | npm workspaces · `@yuxingu/sdk` · `@yuxingu/types` · `@yuxingu/utils` · `@yuxingu/ui` |
|
||||
| Mini-program | Native WeChat scaffold;同 SDK adapters;不与 H5 共享 Vue SFC |
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# TEST_REPORT · ECR-012
|
||||
|
||||
**Date:** 2026-08-12
|
||||
**Result:** PASS(工程师自测)
|
||||
|
||||
## Unit
|
||||
|
||||
```bash
|
||||
cd apps/api && go test ./internal/textsafe/ -count=1
|
||||
# ok
|
||||
```
|
||||
|
||||
## Integration(本机 API :8080)
|
||||
|
||||
| Case | Endpoint | Expected | Actual |
|
||||
|---|---|---|---|
|
||||
| nickname 含「算命」 | POST /auth/register | 40060 | PASS |
|
||||
| nickname 合法「心语岛」 | POST /auth/register | 0 | PASS |
|
||||
| PATCH 昵称违规 | PATCH /auth/me | 40060 | PASS |
|
||||
| display_name「小愈」 | POST /profiles | 0 | PASS |
|
||||
| ask content `<script` | POST /ask/threads/:id/messages | 40060 | PASS |
|
||||
| note 刷屏「啊」×8 | POST /moods | 40060 | PASS |
|
||||
|
||||
## Frontend
|
||||
|
||||
- `@yuxingu/utils` `validateUserText` 镜像规则
|
||||
- 已挂:Login 注册昵称 · AccountNicknameCard · Ask 发送 · Profile 名 · Companion note · Growth title/focus · Synastry invite 称呼
|
||||
|
||||
## Notes
|
||||
|
||||
- 后端为权威;前端仅即时提示
|
||||
- OpenAPI description 已注明 40060
|
||||
@@ -0,0 +1,33 @@
|
||||
# TEST_REPORT · ECR-013
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**Result:** PASS(工程师自测)
|
||||
|
||||
## Unit
|
||||
|
||||
```bash
|
||||
cd apps/api && go test ./internal/scalebank/ ./internal/integration/ -run 'TestCatalogCuratedASet|TestScaleBankResultRoundtrip' -count=1
|
||||
# ok
|
||||
```
|
||||
|
||||
## Vitest
|
||||
|
||||
```bash
|
||||
cd apps/user-h5 && npx vitest run src/pages/ScalePage.spec.ts
|
||||
# 3 passed(含 bank slug 结果回看)
|
||||
```
|
||||
|
||||
## Acceptance map
|
||||
|
||||
| Acceptance | Evidence |
|
||||
|------------|----------|
|
||||
| catalog 精选+四分类;无临床 | TestCatalogCuratedASet · Has("yyzcs") false |
|
||||
| bank Submit/Latest · R8 | TestScaleBankResultRoundtrip · ScalePage.spec bank case |
|
||||
| 精选图标互异 | TestCatalogCuratedASet seen[icon] |
|
||||
| `/explore` 返回 | AppHeader showBack 含 `/explore` |
|
||||
| OpenAPI | `proto/openapi.yaml` `/scale-bank/*` |
|
||||
|
||||
## Notes
|
||||
|
||||
- 题目 embed;DB 仅 EnsurePublished stub
|
||||
- 其它 WIP(时辰 tips / 星座日刷 / 头像)不在本 ECR
|
||||
@@ -0,0 +1,34 @@
|
||||
# TEST_REPORT · ECR-014
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**Result:** PASS(工程师自测)
|
||||
**Retrospective:** true
|
||||
|
||||
## Unit
|
||||
|
||||
```bash
|
||||
cd apps/api && go test ./internal/service/home/ ./internal/service/report/ -count=1
|
||||
# ok
|
||||
```
|
||||
|
||||
## Migration
|
||||
|
||||
- `home_daily_tips` 表已存在于本地 Postgres(000023)
|
||||
|
||||
## Contract
|
||||
|
||||
- OpenAPI:`HomeDailyTips` + `EnvelopeHomeDailyTips`;`GrowthReport.summary` 注明 `as_of`/`valid_until` 换日原地刷新
|
||||
- 前端已消费:`useHomeDailyTips` · `scheduleRefresh` · star/rhythm composables
|
||||
|
||||
## Acceptance map
|
||||
|
||||
| Item | Evidence |
|
||||
|------|----------|
|
||||
| daily-tips 时辰字段 | service DailyTips JSON tags · OpenAPI schema |
|
||||
| star/rhythm 换日 | temporal.go + temporal_test · service Get/Latest 调用 |
|
||||
| OpenAPI | proto/openapi.yaml |
|
||||
| go test | home + report PASS |
|
||||
|
||||
## Process debt(必记)
|
||||
|
||||
实现早于 ECR;本报告不声称正序路径。
|
||||
@@ -0,0 +1,37 @@
|
||||
# TEST_REPORT · ECR-015
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**Result:** PASS(工程师自测)
|
||||
**Retrospective:** true
|
||||
|
||||
## Wiring verified
|
||||
|
||||
| Item | Status |
|
||||
|------|--------|
|
||||
| migration `000018` · `users.avatar_url` | 本地 Postgres 列存在 |
|
||||
| UploadAvatar · MediaHandler · avatar.Store | 已接线 |
|
||||
| SDK `authUploadAvatar` · types `avatar_url` | 已有 |
|
||||
| H5 MinePage + `DEFAULT_AVATAR_SRC` | 已有 · `public/default-avatar.png` |
|
||||
| `apps/api/data/` gitignore | 已有 |
|
||||
|
||||
## Unit
|
||||
|
||||
```bash
|
||||
cd apps/api && go test ./internal/avatar/ -count=1
|
||||
# PASS · ResolveAbs traversal · bad type/size · store+overwrite
|
||||
```
|
||||
|
||||
## Contract
|
||||
|
||||
- OpenAPI:upload 400/401 说明 · media 路径约束说明
|
||||
|
||||
## Process debt
|
||||
|
||||
实现早于 ECR;本报告不声称正序路径。
|
||||
|
||||
## Manual smoke(建议 Reviewer / Human)
|
||||
|
||||
- [ ] 登录「我的」上传 JPG<2MB
|
||||
- [ ] 超限 / 非图片失败文案
|
||||
- [ ] 无头像显示 default-avatar
|
||||
- [ ] 直开 `/api/v1/media/avatars/{uuid}.ext`
|
||||
@@ -0,0 +1,24 @@
|
||||
# TEST_REPORT · ECR-016
|
||||
|
||||
**Date:** 2026-08-13
|
||||
**Result:** PASS
|
||||
**Retrospective:** true
|
||||
|
||||
## DB
|
||||
|
||||
- `mbti-lite` 32 题 · `mbti-full` 60 题 published
|
||||
|
||||
## Unit
|
||||
|
||||
```bash
|
||||
cd apps/api && go test ./internal/scale/ -count=1
|
||||
# ok · TestScoreJungian_ENFP
|
||||
```
|
||||
|
||||
## Contract
|
||||
|
||||
- OpenAPI:`scales/{slug}` 会员锁说明 · ScaleDetail access/locked · POST result 40310
|
||||
|
||||
## Process debt
|
||||
|
||||
实现早于 ECR。
|
||||
@@ -17,3 +17,8 @@
|
||||
| ECR-009 | 运营商业加深 Ops-D(订单筛选 · 展示价 · 退款只读) | **Implemented** | Spec ops-commerce · BD-2026-009 · commit `ca3b135` · LOOP-RUN-002 · Gate PASS |
|
||||
| ECR-010 | 运营系统 Ops-E(RBAC · 封禁 · 推送占位) | **Implemented** | Spec ops-system · BD-2026-010 · TEST_REPORT · CODE_REVIEW · HANDOFF review |
|
||||
| ECR-011 | 昵称 · 首页贴士 · Self 唯一/合盘交叉校验 | **Closed** | TEST_REPORT PASS · CODE_REVIEW Approve · BD-2026-011 |
|
||||
| ECR-012 | 用户文字输入合规 textsafe / 40060 | **Closed** | Spec input-compliance · BD-2026-012 · CODE_REVIEW Approve |
|
||||
| ECR-013 | 探索 curated 题库 A 集 · 结果回看 | **Closed** | Spec explore-test · BD-2026-013 · CODE_REVIEW Approve |
|
||||
| ECR-014 | 时效刷新(时辰贴士 · star/rhythm 按日) | **Closed** | RETRO · BD-2026-014 · TEST_REPORT · CODE_REVIEW Approve |
|
||||
| ECR-015 | 账号头像上传与媒体读取 | **Closed** | RETRO · BD-2026-015 · CODE_REVIEW Approve |
|
||||
| ECR-016 | MBTI OEJTS 标准/完整版 | **Closed** | RETRO · BD-2026-016 · CODE_REVIEW Approve |
|
||||
|
||||
Reference in New Issue
Block a user