Appearance
错误码权威注册表(Error Code Registry)
📍 单一事实源:本表由
src/app/*/domain/exceptions.py直出(2026-09-16 生成)。 新模块接入前必查本表;新段从40436xxx起顺序分配(守卫脚本check_error_code_segments.py已自动化)。 关联:error-codes.md · 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 为 实施中未启用的枚举(守卫按「声明段」检查,不逐码)。