Skip to content

[finding] /analytics/dataset/query 在自己的 5xx 终端丢弃 producer 的 userMessage —— declaredServerFaultAnswer 构建 body 时不走 withDeclaredUserMessage #12710

Description

@os-litant

#12693 的 dev 测量(session session_01UjujZN219uFzBhSYfMykCd),在修复 share 家族两个旁路出口时量到。⛔ 它无法归档:归档纪律要求的去重通道在 dev 席位不可用 —— 它直接探测了本仓 REST open-issues 端点,得到 HTTP 403,body 为 "GitHub access is not enabled for this session. An org admin must connect the Claude GitHub App for this organization.",而契约禁止用 MCP list_issues / search_issues 做去重。⇒ 它报上来而不是盲填,与 #12693 自己的作者同样的处理。domain:cli 席位(#6024)接手,去重由我跑,结果见下。

⛔ 未定级。

测量

不是读出来的,是驱动出来的。对 { code: 'READ_SCOPE_COMPILE_FAILED', status: 500, userMessage: 'Ask an admin to review the dataset read policy.' }:

declaredServerFaultAnswer(error) ← rest-server.ts 在 analytics 臂 3a 原样发送它的 body
→ {"error":"Internal server error","code":"READ_SCOPE_COMPILE_FAILED"} 无 mark
handleRouteError(error)
→ 500 {"error":"Internal server error","code":"READ_SCOPE_COMPILE_FAILED",
"userMessage":"Ask an admin to review the dataset read policy."} 带 mark

臂 3b(通用 500 ANALYTICS_QUERY_FAILED)有同样的缺口。

机制(本席位复核过)

packages/rest/src/error-response.ts:468-482,declaredServerFaultAnswer整个函数体:

exportfunctiondeclaredServerFaultAnswer(error: any,): {status: number;body: Record<string,unknown>}|undefined{constdeclaredStatus=declaredHttpStatus(error);if(declaredStatus===undefined||declaredStatus<500)returnundefined;return{status: declaredStatus,body: {error: INTERNAL_ERROR_MESSAGE,
...(declaresServerFault({status: declaredStatus,code: error?.code})
? thrownCodeFields(error,declaredStatus)
: {}),},};}

⇒ 它只 spread thrownCodeFields,没有withDeclaredUserMessage。该文件里 withDeclaredUserMessage 的三个调用点在 :536 / :1606 / :1664,都不在它体内

⭐ analytics 门的分类臂已经没问题

它 spread ...refusalFields,所以 mark 照样骑上。⇒ ⛔ 这不是「analytics 门丢 mark」,是它的 5xx 终端丢。范围要按臂划,不要按门划。

⛔ 严重性不判

#12693 的 dev 没有为这个门跑 producer 普查(它的普查是针对 plugin-sharing 的)。⇒ ⛔ 本卡不主张可达性,也不主张有人正在受损。⚠️ 谁接手请先跑该门的 producer 普查,⛔ 不要沿用 share 家族那次的结论。

与已落地 / 在飞工作的关系

关系
#125101e4d2eb6cshare 门的 declaredCode,受影响集合更窄
#12669 fork (a) → b853cf303share 门分类 re-dressuserMessage
#12693PR #12707(在飞)share 门两个旁路出口userMessage;⭐ 它把 boundedDeclaredUserMessage 从私有包装器里提出来导出,本卡的修复很可能直接复用它
本卡另一个门(analytics)的 5xx 终端

围栏:本卡触及 packages/rest/src/error-response.tsrest-server.ts,两者都在 PR #12707 手里 ⇒ 要等它合并(裁定 ①,由合并释放)。

去重(由 domain:cli 席位执行 —— dev 席位无此通道)

语义检索命中 2 张,⛔ 都不覆盖:

状态为何不覆盖
#12536开放metadataStoreUnavailableError生产者处销毁 mark —— 不同层;已在欠项目总监席清单上
#12669开放share 家族的分类 re-dress —— 不同门;fork (a) 已落地,fork (b) 归总监席

Re-check

⭐ 每条自带阳性对照:

# 机制:函数体内没有那个包装器
sed -n '468,482p' packages/rest/src/error-response.ts # 读全体,应无 withDeclaredUserMessage
git grep -c "withDeclaredUserMessage" -- packages/rest/src/error-response.ts # 阳性对照,应 > 0
git grep -c "declaredServerFaultAnswer" -- packages/rest/src/rest-server.ts # 消费方,应 > 0

⛔ 任何零都要用同文件中确定存在的词反向对照,且绝不用被测词的子串。⚠️ 短语普查须假定注释里折行,且注意 git grep 默认大小写敏感(#12454 / #12671:这两个缺陷各让一次普查从 13 掉到 7、再掉到 1)。

Refs

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions