在实现 #6369(/analytics/query 响应示例的 fields[] 键集)时,为核实「display name / format 由 GET /analytics/meta 暴露」这句话而顺带查到。按 Prime Directive #10 独立立单,不搭 #6369 那个 docs PR(#6441)的车 —— 那张卡的评审面是 /analytics/query 的响应示例,本条是 /analytics/meta 的响应形状,两件事;而且本条的修复面在 packages/**,#6369 明确不动。
未自我认领。
事实面(实测,file:line)
声明侧 —— 路由表为该端点指定的响应 schema:
packages/spec/src/api/plugin-rest-api.zod.ts:1230 — GET /meta 的 responseSchema: 'AnalyticsMetadataResponseSchema'
packages/spec/src/api/analytics.zod.ts:94-99 — 该 schema 声明 data: z.object({ cubes: z.array(CubeSchema) }),即 一个对象,带 cubes 键,元素是完整的 CubeSchema
content/docs/references/api/analytics.mdx:49 — 由上面这个 schema 生成并已发布的参考页照印:data 为 { cubes: { name: string; title?: string; description?: string; sql: string; … }[] }
实际侧 —— 运行时真正返回的:
packages/runtime/src/domains/analytics.ts:110-117 — subPath === 'meta' && m === 'GET' ⇒ const result = await analyticsService.getMeta(cube); return deps.success(result)
packages/services/service-analytics/src/analytics-service.ts:1184-1204 — getMeta 返回 CubeMeta[],一个裸数组
packages/spec/src/contracts/analytics-service.ts:89-99 — CubeMeta 是更窄的投影:{ name, title?, measures: Array< { name, type, title? } >, dimensions: Array< { name, type, title? } > }
- 第二个实现同形:
packages/drivers/driver-memory/src/memory-analytics.ts:504-522
也就是说,按已发布契约写的客户端读 data.cubes 拿到的是 undefined(实际 data 本身就是数组),拿 AnalyticsMetadataResponseSchema 去 parse 会直接失败。
顺带的第二个后果:metric 的 format 没有任何读端点暴露
MetricSchema.format(packages/spec/src/data/analytics.zod.ts:72)被 packages/services/service-analytics/src/dataset-compiler.ts:381 写入编译出的 cube metric,但 getMeta 的 CubeMeta 投影只保留 { name, type, title } —— format(以及 sql / filters / description)在投影里被丢弃。
这正是 #6441 里那处「对分诊措辞的实测修正」的来源:分诊原句说 display name 与 format 都「由 GET /analytics/meta 暴露」,实测只有 label(映射为 title)到得了线上,format 到不了。#6441 因此只对 label 那半句写进了文档。
影响 / 修法方向(不自行选)
两个方向对称度不高,需要裁定:
- (a) 收窄声明:把
AnalyticsMetadataResponseSchema 改成实际形状(data: CubeMeta[])。零运行时改动,契约照实描述;代价是承认 /analytics/meta 只发投影,format 等键继续不可达。
- (b) 放宽实现:让
getMeta 按已声明的 { cubes: CubeSchema[] } 返回完整 cube 定义。这会扩大该端点的输出面(把 sql 也发到客户端),属能力扩张,按启动期聚焦原则应先问有没有真实消费方拉动。
⚠️ 严重性我不自评:data-api.mdx:393-395 的手写描述其实贴近实际形状(说 data 是数组),只有 spec schema 和由它生成的 references/ 参考页是错的;一个只读手写页的读者不会撞上,一个照生成参考页或照 schema 写类型的读者会。这两种读者哪个是今天的真实用户,由分诊判定。
查重
搜过本仓 open issue:analytics meta cubes response schema / AnalyticsMetadataResponseSchema / CubeMeta / getMeta cube metadata format label / "analytics/meta" —— 除 #6369 本身外无同题单。
在实现 #6369(
/analytics/query响应示例的fields[]键集)时,为核实「display name / format 由GET /analytics/meta暴露」这句话而顺带查到。按 Prime Directive #10 独立立单,不搭 #6369 那个 docs PR(#6441)的车 —— 那张卡的评审面是/analytics/query的响应示例,本条是/analytics/meta的响应形状,两件事;而且本条的修复面在packages/**,#6369 明确不动。未自我认领。
事实面(实测,file:line)
声明侧 —— 路由表为该端点指定的响应 schema:
packages/spec/src/api/plugin-rest-api.zod.ts:1230—GET /meta的responseSchema: 'AnalyticsMetadataResponseSchema'packages/spec/src/api/analytics.zod.ts:94-99— 该 schema 声明data: z.object({ cubes: z.array(CubeSchema) }),即 一个对象,带cubes键,元素是完整的CubeSchemacontent/docs/references/api/analytics.mdx:49— 由上面这个 schema 生成并已发布的参考页照印:data为{ cubes: { name: string; title?: string; description?: string; sql: string; … }[] }实际侧 —— 运行时真正返回的:
packages/runtime/src/domains/analytics.ts:110-117—subPath === 'meta' && m === 'GET'⇒const result = await analyticsService.getMeta(cube); return deps.success(result)packages/services/service-analytics/src/analytics-service.ts:1184-1204—getMeta返回CubeMeta[],一个裸数组packages/spec/src/contracts/analytics-service.ts:89-99—CubeMeta是更窄的投影:{ name, title?, measures: Array< { name, type, title? } >, dimensions: Array< { name, type, title? } > }packages/drivers/driver-memory/src/memory-analytics.ts:504-522也就是说,按已发布契约写的客户端读
data.cubes拿到的是undefined(实际data本身就是数组),拿AnalyticsMetadataResponseSchema去 parse 会直接失败。顺带的第二个后果:metric 的
format没有任何读端点暴露MetricSchema.format(packages/spec/src/data/analytics.zod.ts:72)被packages/services/service-analytics/src/dataset-compiler.ts:381写入编译出的 cube metric,但getMeta的CubeMeta投影只保留{ name, type, title }——format(以及sql/filters/description)在投影里被丢弃。这正是 #6441 里那处「对分诊措辞的实测修正」的来源:分诊原句说 display name 与 format 都「由
GET /analytics/meta暴露」,实测只有 label(映射为title)到得了线上,format 到不了。#6441 因此只对 label 那半句写进了文档。影响 / 修法方向(不自行选)
两个方向对称度不高,需要裁定:
AnalyticsMetadataResponseSchema改成实际形状(data: CubeMeta[])。零运行时改动,契约照实描述;代价是承认/analytics/meta只发投影,format等键继续不可达。getMeta按已声明的{ cubes: CubeSchema[] }返回完整 cube 定义。这会扩大该端点的输出面(把sql也发到客户端),属能力扩张,按启动期聚焦原则应先问有没有真实消费方拉动。data-api.mdx:393-395的手写描述其实贴近实际形状(说data是数组),只有 spec schema 和由它生成的references/参考页是错的;一个只读手写页的读者不会撞上,一个照生成参考页或照 schema 写类型的读者会。这两种读者哪个是今天的真实用户,由分诊判定。查重
搜过本仓 open issue:
analytics meta cubes response schema/AnalyticsMetadataResponseSchema/CubeMeta/getMeta cube metadata format label/"analytics/meta"—— 除 #6369 本身外无同题单。