---
url: /docs/ai-contexts/error-code-registry.md
---
# 错误码权威注册表（Error Code Registry）

> 📍 **单一事实源**：本表由 `src/app/*/domain/exceptions.py` 直出（2026-09-16 生成）。
> **新模块接入前必查本表**；新段从 **`40436xxx`** 起顺序分配（守卫脚本 `check_error_code_segments.py` 已自动化）。
> 关联：[error-codes.md](/internal-wiki/architecture/error-codes) · [api-testing](/internal-wiki/operations/api-testing)

## 段分配总表（40 段 · 281 码 · 跨模块撞码 **1 次已修复**）

| 段 | 模块 | 码数 |
|---|---|---|
| 40001xxx | oauth（历史通用段） | 1 |
| 40101xxx | oauth | 12 |
| 40201xxx | admin | 63 |
| 40301xxx | user | 12 |
| 40401xxx | honor | 6 |
| 40402xxx | zepp | 5 |
| 40403xxx | device | 11 |
| 40404xxx | xiaomi | 2 |
| 40405xxx | shoes | 6 |
| 40406xxx | training | 4 |
| 40407xxx | goal | 11 |
| 40408xxx | wallet | 6 |
| 40409xxx | points | 5 |
| 40410xxx | coupon | 4 |
| 40411xxx | cart | 5 |
| 40412xxx | mall | 14 |
| 40413xxx | group\_buy | 5 |
| 40414xxx | distribution | 7 |
| 40415xxx | favorite | 2 |
| 40416xxx | review | 7 |
| 40417xxx | suunto | 2 |
| 40418xxx | sport | 10 |
| 40419xxx | upload | 6 |
| 40420xxx | feed | 3 |
| 40421xxx | follow | 4 |
| 40422xxx | ranking + **stats**（⚠️ 共享段 — 见下方说明） | 3 |
| 40423xxx | recipe | 4 |
| 40424xxx | food | 4 |
| 40425xxx | boohee | 3 |
| 40426xxx | rd（研发日志/归集） | 9 |
| 40427xxx | health\_archive（健康档案聚合） | 3 |
| 40428xxx | simulation（Dev 仿真数据） | 5 |
| 40429xxx | default\_template（默认数据模板） | 5 |
| 40430xxx | debug\_workbench（调试工作台） | 9 |
| 40431xxx | honeypot（蜜罐 — 后台访问异常检测） | 2 |
| 40432xxx | watchtower（瞭望塔 — 后台守护监视） | 2 |
| 40433xxx | thoth（知识库 — 2026-09-24 由 kb 改名，**端点与表名不变**） | 3 |
| 40434xxx | sysmap（系统地图向导 — 2026-09-24 立项，vendor Archify 校验/渲染） | 3 |
| 40435xxx | qingmu\_band（青沐手环 — 活手环增量/管理面） | 1 |
| 40436xxx | city（行政区划 + 用户城市绑定 — 2026-09-30 由 40431 重分配） | 5 |
| 40437xxx | app\_storage（前端 APP COS 直传 — 预签名 URL；2026-09-30 曾误用 40432 → 重分配 40437） | 9 |
| 40438xxx | rhythmind\_report（APP AI 运动报告 — Celery CLI 模式） | 9 |

> ⚠️ **40426 曾发生跨模块撞码**（2026-09-20 审查发现）：simulation 模块设计时误用 40426，
> 与 rd 的 `40426001..005` **逐码重号且语义不同**（`40426002` 在 rd 是 `PROJECT_NOT_FOUND`、
> 在 simulation 曾是 `UNAUTHORIZED`）。
> **根因**：查段占用时用了 `grep ... | head -25` —— **被截断在 40425**，没看到 40426 已被占用。
> **教训：查段占用必须全量扫描，不能用截断输出下结论。**
> 正确查法：`grep -rhoE '"404[0-9]{2}[0-9]{3}"' src/app/ | cut -c1-6 | sort -u`
> 处置：simulation 已迁至 **40428xxx**。

> ⚠️ **40422xxx 是 ranking 与 stats 的事实共享段**（2026-09-20 审查确认，非本轮引入）：
> 两域的 `PARAM_INVALID` / `UNAUTHORIZED` / `NOT_FOUND` **逐码重号且语义完全相同**
> （`40422001`/`002`/`004`）。
>
> **为什么暂不处置**：与 40426 那次不同 —— 那次是**语义冲突**（同一码在两域含义不同，
> 前端按码分支会走错逻辑）；这次**语义一致**，前端对同一个码的处理行为相同，**实际无危害**。
>
> **遗留风险**：将来任一方**新增码**时会真冲突（目前两域各自只用到 001/002/004，未交叉）。
> **建议**：下一次动 stats 或 ranking 的错误码时，顺手把一方迁到空段。
> ⚠️ 原文建议的 `40429xxx` **已于 2026-09-20 被 default\_template 占用**（见下）——
> 请改用 **`40430xxx`**（当前最高已用段是 40429，40430 起为空）。
> 分配前**务必按下方全量扫描法复核**，不要照抄本行。
> 注：`stats/CLAUDE.md` 登记的就是 40422 —— 两个模块**都以为**这段是自己的。

## 同模块别名（合法 — 有意复用，非撞段）

| 码 | 别名 | 说明 |
|---|---|---|
| 40101003 | oauth.SMS\_CODE\_WRONG / CAPTCHA\_WRONG | 验证码错误统一码 |
| 40201004 | admin.NOT\_FOUND / PERMISSION\_DENIED | Enum 别名（RBAC→403 靠 http\_status 覆盖）|
| 40201102 | admin.USER\_ALREADY\_BOUND / USER\_ALREADY\_BANNED | user 域双语义 |
| 40201103 | admin.USER\_BAN\_FAILED / USER\_ONLINE\_KICK\_REQUIRED | 封禁失败双因 |
| 40201302 | admin.ORDER\_REFUND\_FAILED / ORDER\_STATUS\_NOT\_ALLOWED | 退款状态共用 |
| 40201402 | admin.WITHDRAWAL\_ALREADY\_PROCESSED / STATUS\_NOT\_ALLOWED | 审批状态共用 |
| 40201501 | admin.LOGIN\_FAILED / REVIEW\_NOT\_FOUND | 历史双占用（P2-A 记录）|

## 历史撞段与迁移记录（2026-09-16 治理）

跨模块撞码 13 组已全部迁移（「后迁者迁出」原则）：

| 旧码 | 迁出方 | 新码 | 保留方 |
|---|---|---|---|
| 40301001 | oauth.USER\_BANNED（霸占 user 段）| 40101013 | user.PARAM\_INVALID |
| 40405001/2 | suunto（2 码）| 40417001/2 | shoes |
| 40413xxx | sport（10 码）| 40418xxx | group\_buy |
| 40413xxx | feed（3 码）| 40420xxx | group\_buy |
| 40414xxx | upload（6 码）| 40419xxx | distribution |
| 40414xxx | follow（4 码）| 40421xxx | distribution |

## 分模块全量码表

### admin（63 码）

| 码 | 枚举名 |
|---|---|
| 40201001 | PARAM\_INVALID |
| 40201002 | UNAUTHORIZED |
| 40201003 | FORBIDDEN |
| 40201004 | NOT\_FOUND |
| 40201005 | CONFLICT |
| 40201006 | USER\_BANNED |
| 40201007 | INTERNAL\_ERROR |
| 40201004 | PERMISSION\_DENIED |
| 40201101 | USER\_NOT\_FOUND |
| 40201102 | USER\_ALREADY\_BOUND |
| 40201103 | USER\_BAN\_FAILED |
| 40201102 | USER\_ALREADY\_BANNED |
| 40201103 | USER\_ONLINE\_KICK\_REQUIRED |
| 40201104 | USER\_HAS\_PENDING\_ORDERS |
| 40201105 | USER\_DELETION\_INCOMPLETE |
| 40201201 | CONTENT\_NOT\_FOUND |
| 40201202 | CONTENT\_ALREADY\_PUBLISHED |
| 40201203 | CONTENT\_NOT\_PUBLISHED |
| 40201204 | CONTENT\_HAS\_COMMENTS |
| 40201205 | CONTENT\_ALREADY\_FEATURED |
| 40201206 | CONTENT\_TAG\_CONFLICT |
| 40201207 | CONTENT\_CATEGORY\_DEPTH\_EXCEEDED |
| 40201208 | COMMENT\_NOT\_FOUND |
| 40201301 | ORDER\_NOT\_FOUND |
| 40201302 | ORDER\_REFUND\_FAILED |
| 40201302 | ORDER\_STATUS\_NOT\_ALLOWED |
| 40201303 | ORDER\_REFUND\_CONFLICT |
| 40201304 | ORDER\_REFUND\_AMOUNT\_EXCEEDED |
| 40201305 | ORDER\_REFUND\_BALANCE\_INSUFFICIENT |
| 40201306 | ORDER\_SHIPPED\_ADDRESS\_LOCKED |
| 40201307 | ORDER\_PARTIAL\_REFUND\_UNSUPPORTED |
| 40201308 | ORDER\_PAYMENT\_MISMATCH |
| 40201309 | ORDER\_REFUND\_WINDOW\_EXCEEDED |
| 40201310 | ORDER\_ADJUST\_AMOUNT\_INVALID |
| 40201401 | WITHDRAWAL\_NOT\_FOUND |
| 40201402 | WITHDRAWAL\_ALREADY\_PROCESSED |
| 40201402 | WITHDRAWAL\_STATUS\_NOT\_ALLOWED |
| 40201403 | WITHDRAWAL\_DUPLICATE\_PAYOUT |
| 40201404 | WITHDRAWAL\_CHANNEL\_FAILURE |
| 40201405 | WITHDRAWAL\_BANK\_INFO\_MISMATCH |
| 40201406 | WITHDRAWAL\_PAYOUT\_CAP\_EXCEEDED |
| 40201501 | LOGIN\_FAILED |
| 40201501 | REVIEW\_NOT\_FOUND |
| 40201502 | REVIEW\_ALREADY\_REVIEWED |
| 40201502 | LOGIN\_RATE\_LIMITED |
| 40201503 | REVIEW\_APPEAL\_ALREADY\_HANDLED |
| 40201504 | REVIEW\_APPEAL\_TIMEOUT |
| 40201601 | INTERPRET\_REPORT\_NOT\_FOUND |
| 40201602 | INTERPRET\_HEALTH\_DATA\_MISSING |
| 40201603 | INTERPRET\_BODY\_COMPOSITION\_MISSING |
| 40201604 | INTERPRET\_ALREADY\_WRITTEN |
| 40201701 | RELEASE\_VERSION\_NOT\_FOUND |
| 40201702 | RELEASE\_ROLLOUT\_CONFLICT |
| 40201703 | RELEASE\_ROLLBACK\_TARGET\_NOT\_FOUND |
| 40201704 | RELEASE\_ROLLOUT\_PERCENTAGE\_INVALID |
| 40201706 | RELEASE\_ALREADY\_ROLLED\_BACK |
| 40201721 | CHANNEL\_NOT\_FOUND |
| 40201722 | CHANNEL\_SWITCH\_FAILED |
| 40201723 | CHANNEL\_ALREADY\_CLOSED |
| 40201741 | CONFIG\_KEY\_NOT\_FOUND |
| 40201742 | CONFIG\_VALUE\_INVALID |
| 40201743 | CONFIG\_DICTIONARY\_NOT\_FOUND |
| 40201744 | CONFIG\_DICTIONARY\_DUPLICATE |
| 40201761 | AUDIT\_LOG\_QUERY\_FAILED |

### cart（5 码）

| 码 | 枚举名 |
|---|---|
| 40411001 | PARAM\_INVALID |
| 40411002 | UNAUTHORIZED |
| 40411004 | NOT\_FOUND |
| 40411005 | PRODUCT\_OFF\_SHELF |
| 40411006 | CART\_ITEM\_NOT\_FOUND |

### coupon（4 码）

| 码 | 枚举名 |
|---|---|
| 40410001 | PARAM\_INVALID |
| 40410002 | UNAUTHORIZED |
| 40410004 | NOT\_FOUND |
| 40410005 | ALREADY\_RECEIVED |

### device（11 码）

| 码 | 枚举名 |
|---|---|
| 40403001 | PARAM\_INVALID |
| 40403002 | UNAUTHORIZED |
| 40403004 | NOT\_FOUND |
| 40403005 | BINDING\_NOT\_FOUND |
| 40403006 | VENDOR\_REVIEWING |
| 40403007 | VENDOR\_METHOD\_NOT\_SUPPORTED |
| 40403008 | SHARE\_IMAGE\_FAILED |
| 40403009 | RECORD\_NO\_TRACK |
| 40403010 | RECORD\_DELETE\_FAILED（运动记录删除失败 — 存储抖动 502 可重试） |
| 40403011 | RECORD\_NOT\_DELETABLE（设备同步记录不可删 — Q22 防同步复活） |

### distribution（7 码）

| 码 | 枚举名 |
|---|---|
| 40414001 | PARAM\_INVALID |
| 40414002 | UNAUTHORIZED |
| 40414004 | NOT\_FOUND |
| 40414005 | WITHDRAW\_MIN\_AMOUNT |
| 40414006 | WITHDRAW\_INSUFFICIENT |
| 40414007 | WITHDRAW\_PENDING\_EXISTS |
| 40414008 | TEAM\_ALREADY\_BOUND |

### favorite（2 码）

| 码 | 枚举名 |
|---|---|
| 40415001 | PARAM\_INVALID |
| 40415002 | UNAUTHORIZED |

### feed（3 码）

| 码 | 枚举名 |
|---|---|
| 40420001 | PARAM\_INVALID |
| 40420002 | UNAUTHORIZED |
| 40420004 | NOT\_FOUND |

### follow（4 码）

| 码 | 枚举名 |
|---|---|
| 40421001 | PARAM\_INVALID |
| 40421002 | UNAUTHORIZED |
| 40421004 | NOT\_FOUND |
| 40421005 | SELF\_FOLLOW |

### goal（11 码）

| 码 | 枚举名 |
|---|---|
| 40407001 | PARAM\_INVALID |
| 40407002 | UNAUTHORIZED |
| 40407004 | NOT\_FOUND |
| 40407005 | PERIOD\_INVALID |
| 40407006 | TARGET\_REQUIRED |
| 40407008 | PROGRESS\_MANUAL\_DISABLED |
| 40407009 | FAMILY\_NOT\_JOINED |
| 40407010 | FAMILY\_FORBIDDEN |
| 40407011 | MILESTONE\_LIMIT |
| 40407012 | MILESTONE\_DUPLICATE |
| 40407013 | MILESTONE\_NOT\_FOUND |

### group\_buy（5 码）

| 码 | 枚举名 |
|---|---|
| 40413001 | PARAM\_INVALID |
| 40413002 | UNAUTHORIZED |
| 40413004 | NOT\_FOUND |
| 40413005 | GROUP\_BUY\_REACHED |
| 40413006 | ALREADY\_JOINED |

### honor（6 码）

| 码 | 枚举名 |
|---|---|
| 40401001 | PARAM\_INVALID |
| 40401006 | SESSION\_EXPIRED |
| 40401007 | USER\_NOT\_FOUND |
| 40401008 | TOKEN\_EXCHANGE\_FAILED |
| 40401009 | ADOPT\_SOURCE\_MISSING |
| 40401005 | UNCONFIGURED |

### mall（14 码）

| 码 | 枚举名 |
|---|---|
| 40412001 | PARAM\_INVALID |
| 40412002 | UNAUTHORIZED |
| 40412004 | NOT\_FOUND |
| 40412005 | PRODUCT\_OFF\_SHELF |
| 40412006 | FORBIDDEN |
| 40412007 | ILLEGAL\_STATE |
| 40412008 | GROUP\_BUY\_NOT\_FOUND |
| 40412009 | GROUP\_BUY\_NOT\_REACHED |
| 40412010 | GROUP\_BUY\_NOT\_JOINED |
| 40412011 | POINTS\_INSUFFICIENT |
| 40412012 | USER\_BANNED |
| 40412014 | PAYMENT\_UNAVAILABLE |
| 40412015 | PARTIAL\_OFF\_SHELF |
| 40412016 | GROUP\_BUY\_ITEM\_INVALID |

### oauth（13 码）

| 码 | 枚举名 |
|---|---|
| 40101001 | SMS\_CODE\_NOT\_FOUND |
| 40101003 | SMS\_CODE\_WRONG |
| 40101003 | CAPTCHA\_WRONG |
| 40101004 | CAPTCHA\_EXPIRED |
| 40101005 | RATE\_LIMITED |
| 40101006 | SMS\_SEND\_FAILED |
| 40101007 | WECHAT\_BIND\_FAILED |
| 40101008 | AGREEMENT\_NOT\_ACCEPTED |
| 40101010 | WECHAT\_LOGIN\_FAILED |
| 40101011 | TOKEN\_INVALID |
| 40101012 | TOKEN\_REPLAYED |
| 40101013 | USER\_BANNED |
| 40001001 | PARAM\_INVALID |

### points（5 码）

| 码 | 枚举名 |
|---|---|
| 40409001 | PARAM\_INVALID |
| 40409002 | UNAUTHORIZED |
| 40409004 | NOT\_FOUND |
| 40409005 | SIGNIN\_ALREADY |
| 40409006 | POINTS\_INSUFFICIENT |

### review（7 码）

| 码 | 枚举名 |
|---|---|
| 40416001 | PARAM\_INVALID |
| 40416002 | UNAUTHORIZED |
| 40416003 | FORBIDDEN |
| 40416004 | NOT\_FOUND |
| 40416005 | ORDER\_NOT\_PAID |
| 40416006 | PRODUCT\_NOT\_IN\_ORDER |
| 40416007 | ALREADY\_REVIEWED |

### shoes（6 码）

| 码 | 枚举名 |
|---|---|
| 40405001 | PARAM\_INVALID |
| 40405002 | UNAUTHORIZED |
| 40405004 | NOT\_FOUND |
| 40405005 | ALREADY\_RETIRED |
| 40405006 | COMPARE\_SELECT\_TWO |
| 40405007 | COMPARE\_NOT\_YOURS |

### sport（10 码）

| 码 | 枚举名 |
|---|---|
| 40418001 | PARAM\_INVALID |
| 40418002 | UNAUTHORIZED |
| 40418004 | NOT\_FOUND |
| 40418005 | CHECKIN\_ALREADY |
| 40418006 | NOT\_GROUP\_MEMBER |
| 40418007 | GROUP\_OWNER\_QUIT |
| 40418008 | GROUP\_OWNER\_ONLY |
| 40418009 | GROUP\_LIMIT |
| 40418010 | ALREADY\_IN\_GROUP |
| 40418011 | USER\_BANNED |

### suunto（2 码）

| 码 | 枚举名 |
|---|---|
| 40417001 | INVALID\_SIGNATURE |
| 40417002 | NOTIFICATION\_INVALID |

### training（4 码）

| 码 | 枚举名 |
|---|---|
| 40406001 | PARAM\_INVALID |
| 40406002 | UNAUTHORIZED |
| 40406004 | NOT\_FOUND |
| 40406005 | PLAN\_ARCHIVED |

### upload（6 码）

| 码 | 枚举名 |
|---|---|
| 40419001 | PARAM\_INVALID |
| 40419002 | UNAUTHORIZED |
| 40419003 | NO\_FILE |
| 40419004 | UNSUPPORTED\_MIME |
| 40419005 | FILE\_TOO\_LARGE |
| 40419006 | RECORD\_NOT\_FOUND |

### user（12 码）

| 码 | 枚举名 |
|---|---|
| 40301001 | PARAM\_INVALID |
| 40301002 | UNAUTHORIZED |
| 40301004 | NOT\_FOUND |
| 40301005 | BINDING\_CONFLICT |
| 40301006 | POINTS\_INSUFFICIENT |
| 40301007 | REDEEM\_PACKAGE\_INVALID |
| 40301008 | INVITER\_INVALID |
| 40301009 | MEMBER\_CAP\_EXCEEDED |
| 40301010 | PROFILE\_INCOMPLETE |
| 40301011 | PLAN\_OPTION\_INVALID |
| 40301012 | DELETE\_BLOCKED |
| 40301013 | AGE\_INVALID |

### wallet（6 码）

| 码 | 枚举名 |
|---|---|
| 40408001 | PARAM\_INVALID |
| 40408002 | UNAUTHORIZED |
| 40408004 | NOT\_FOUND |
| 40408005 | WALLET\_FROZEN |
| 40408006 | INSUFFICIENT\_BALANCE |
| 40408007 | PAYMENT\_DISABLED |

### xiaomi（2 码）

| 码 | 枚举名 |
|---|---|
| 40404001 | INVALID\_SIGNATURE |
| 40404002 | NOTIFICATION\_INVALID |

### zepp（5 码）

| 码 | 枚举名 |
|---|---|
| 40402001 | PARAM\_INVALID |
| 40402002 | UNAUTHORIZED |
| 40402006 | SESSION\_EXPIRED |
| 40402005 | UNCONFIGURED |
| 40402010 | WEBHOOK\_BODY\_MISSING |

### health\_archive（3 码）

| 码 | 枚举名 | 说明 |
|---|---|---|
| 40427001 | PARAM\_INVALID | 请求参数非法（未知 action / 阈值不合法）→ 400 |
| 40427002 | UNAUTHORIZED | 未登录 / token 无效 → 401 |
| 40427004 | NOT\_FOUND | 资源不存在 → 404（**预留** — 当前无使用点） |

### simulation（5 码）

| 码 | 枚举名 | 说明 |
|---|---|---|
| 40428001 | PARAM\_INVALID | 请求参数非法（未知 action / 天数越界）→ 400 |
| 40428002 | UNAUTHORIZED | 未登录 / token 无效 → 401 |
| 40428003 | DISABLED | 仿真被禁用（开关关 或 非 dev 库）→ 403 |
| 40428004 | NOT\_FOUND | 目标用户不存在 → 404 |
| 40428005 | PROFILE\_INCOMPLETE | 四维不全 —— 无可信输入，拒绝生成 → 400 |

> 📌 simulation 是 **Dev 专用**工具：`DISABLED`（40428003）在生产环境必然触发 ——
> 这是**设计**（双守卫 fail-closed），不是故障。

### default\_template（5 码）

| 码 | 枚举名 | 说明 |
|---|---|---|
| 40429001 | PARAM\_INVALID | 请求参数非法（未知运动类型等）→ 400 |
| 40429002 | UNAUTHORIZED | 未登录 / token 无效 → 401 |
| 40429003 | DISABLED | 模板被禁用（开关关 或 Dev 库跳过）→ 403 |
| 40429004 | NOT\_FOUND | 目标用户画像不存在 → 404 |
| 40429005 | PROFILE\_INCOMPLETE | 四维不全 —— 无可信输入，拒绝生成 → 400 |

> 📌 default\_template 与 simulation **判据相反**（模板只在**非 dev** 库生成，Dev 已有仿真）；
> 且本模块**无 HTTP 路由** —— 上述码目前只有 `ClearDefaultTemplateUseCase`（显式调用）
> 会抛 `DISABLED`（40429003）。注册链路上的生成用例**承诺预期路径不抛**（静默跳过 + 留痕）。

### app\_storage（9 码 · 2026-09-30，段号 40437）

前端 APP COS 直传（方案 D：预签名 URL + 4 道护栏）—— 路径 `/api/v1/app-storage/*`。

| 码 | 枚举名 | 说明 |
|---|---|---|
| 40432001 | UNAUTHORIZED | 未登录 / token 无效 → 401 |
| 40432002 | PARAM\_INVALID | 请求参数非法（**预留** — 当前无使用点） |
| 40432004 | QUOTA\_EXCEEDED | 配额超限（每日 5000 次 / 500MB）→ 429 |
| 40432010 | PATH\_TAMPERING | objectKey 前缀不匹配当前用户（防越权）→ 400 |
| 40432011 | OBJECT\_NOT\_FOUND | COS 对象不存在（HeadObject 404）→ 404 |
| 40432012 | SIZE\_MIME\_MISMATCH | 上报 size/mime 与 COS 头部不一致（或超 50MB）→ 400 / 413 |
| 40432013 | MIME\_FORBIDDEN | MIME 不在白名单 → 400 |
| 40432015 | BIZ\_INVALID | biz 字段非法（不在 avatar/post/report/screenshot/nutrition）→ 400 |
| 40432030 | DELETE\_FAILED | COS DeleteObject 失败 → 500 |

> 📌 **段号 40437** —— 原规划 40432 与 main 上 watchtower 撞段（2026-09-30 rebase 时发现，撞车形态⑤：查段占用未基于远端）→ 重分配。
> 📌 本模块**零 CAM 配置**（预签名 URL 用后端既有 COS 密钥签名）—— 曾按 STS 临时凭证实现
> （40432xxx 段内预留 `STS_ASSUME_ROLE_FAILED`），方案切换后该码已删除。

### rhythmind\_report（9 码 · 2026-10-08）

APP AI 运动报告生成（Celery CLI 模式）—— 路径 `/api/v1/rhythmind/*`。

| 码 | 枚举名 | 说明 |
|---|---|---|
| 40438001 | UNAUTHORIZED | 未登录 / token 无效 → 401 |
| 40438002 | PARAM\_INVALID | 请求参数非法（**预留** — 当前无使用点） |
| 40438004 | QUOTA\_EXCEEDED | 每日生成次数超限（10 次/用户/日）→ 429 |
| 40438010 | UNSUPPORTED\_FORMAT | 文件格式不支持（非 fit/tcx/华为 json）→ 422 |
| 40438011 | PARSE\_FAILED | 数据解析失败（损坏/无有效数据）→ 422 |
| 40438012 | SCHEMA\_INVALID | 未过统一 schema 校验（时长过短/无量化数据）→ 422 |
| 40438020 | JOB\_NOT\_FOUND | 任务不存在或非本人（防枚举）→ 404 |
| 40438021 | LLM\_FAILED | 智谱调用失败（润色有降级，此码=致命态）→ 503 |
| 40438030 | REPORT\_NOT\_READY | 报告尚未生成完成 → 409 |

> 📌 段号 40438 基于远端 registry（40 段时点）分配。另 40438022 RENDER\_FAILED /
> 40438031 STORAGE\_FAILED / 40438013 MIME\_FORBIDDEN / 40438015 BIZ\_INVALID 为
> 实施中未启用的枚举（守卫按「声明段」检查，不逐码）。
